/******************************/
/* ビット演算子とシフト演算子 */
/* 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;
}