C でのビット操作に関してのまとめ。基本的な AND, OR, XOR, NOT。そして、ビットシフトの方法に関する記事です。
AND ( & )
AND はバイナリオペレーション。両者とも 1 の場合に結果も 1 になる。
1 2 3 4 5 6 | int main (void) { unsigned short a = 12, b = 4, c; c = a & b; printf("a & b = %d\n", c); // c = 4 } |
OR ( | )
OR はどちらかが 1 なら 1。
1 2 3 4 5 6 | int main (void) { unsigned short a = 12, b = 4, c; c = a | b; printf("a | b = %d\n", c); // c = 12 } |
XOR ( ^ )
XOR は同じビットは 0、そうでないなら 1。
1 2 3 4 5 6 | int main (void) { unsigned short a = 12, b = 4, c; c = a ^ b; printf("a ^ b = %d\n", c); // c = 8 } |
NOT ( ~ )
NOT はビットを反転させる。
1 2 3 4 5 6 | int main (void) { unsigned short a = 65534, b; b = ~a; printf("b = %d\n", b); // b = 1 } |
XOR での swap
XOR をオペレーターをしようすれば、余分な変数を使用する必要なく変数の値を交換できます。
1 2 3 4 5 6 7 8 9 10 11 12 | int main (void) { int a = 10; int b = -10; a = a ^ b; b = a ^ b; a = a ^ b; printf("a = %d\n", a); // a = -10 printf("b = %d\n", b); // b = 10 } |
ビットシフト («, »)
ビットシフト操作は基本的に unsigned のデータに使用する。これは、ANSI C が、右シフトの際にゼロをシフトするか、MSBをシフトするかは、コンパイラ次第と規定しているため。unsigned の場合には、いつもゼロがシフトされる。
1 2 3 4 5 6 7 8 9 10 11 | int main (void) { unsigned short a = 3, b = 7, c = 32768, d; d = a << 3; printf("a << 3 = %d\n", d); // d = 24 d = b >> 2; printf("b >> 2 = %d\n", d); // d = 1 d = c >> 14; printf("c >> 14 = %d\n", d); // d = 2 } |