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