ビット演算とシフト演算

/******************************/
/* ビット演算子とシフト演算子 */
/*      coded by Y.Suganuma   */
/******************************/
#include <stdio.h>

int main()
{
	int y1, y2, z1, z2;
	int x1 = 0x00000031;
	int x2 = 0xfffffff2;
	int a = -3;
	unsigned int b, w1, w2;
/*
		 ビット演算子
*/
	y1 = x1 & 0x0000000f;     /* 下位4ビットの取り出し */
	y2 = x2 & 0x0000000f;     /* 下位4ビットの取り出し */
	z1 = y1 ^ y2;             /* 排他的論理和(和になっている) */
	z2 = ~z1 + 1;             /* -3に対する2の補数表現 */
	printf("ビット演算子\n");
	printf("   y1 %08x(%d) y2 %08x(%d)\n", y1, y1, y2, y2);
	printf("   z1 %08x(%d) z2 %08x(%d)\n", z1, z1, z2, z2);
/*
		 シフト演算子
*/
	b  = (unsigned)a;
	y1 = a << 3;              /* 左に3ビットシフト(8倍,符号付き) */
	w1 = b << 3;              /* 左に3ビットシフト(8倍,符号なし) */
	printf("シフト演算子\n");
	printf("   a %08x(%d) y1 %08x(%d) w1 %08x(%d)\n", a, a, y1, y1, w1, w1);
	y2 = y1 >> 3;             /* 右に3ビットシフト(1/8倍,符号付き) */
	w2 = w1 >> 3;             /* 右に3ビットシフト(1/8倍,符号なし) */
	printf("   y2 %08x(%d) w2 %08x(%d)\n", y2, y2, w2, w2);

	return 0;
}
		

  このプログラムは以下の結果を出力します.
ビット演算子
   y1 00000001(1) y2 00000002(2)
   z1 00000003(3) z2 fffffffd(-3)
シフト演算子
   a fffffffd(-3) y1 ffffffe8(-24) w1 ffffffe8(-24)
   y2 fffffffd(-3) w2 1ffffffd(536870909)