Menu

Category

Archive

logo


C言語でのビットレベルの処理

2014-05-24 16:00:00 +0900
  • このエントリーをはてなブックマークに追加

C でのビット操作に関してのまとめ。基本的な AND, OR, XOR, NOT。そして、ビットシフトの方法に関する記事です。

AND ( & )

AND はバイナリオペレーション。両者とも 1 の場合に結果も 1 になる。

1 int main (void)
2 {
3     unsigned short a = 12, b = 4, c;
4     c = a & b;
5     printf("a & b = %d\n", c); // c = 4
6 }

OR ( | )

OR はどちらかが 1 なら 1。

1 int main (void)
2 {
3     unsigned short a = 12, b = 4, c;
4     c = a | b;
5     printf("a | b = %d\n", c); // c = 12
6 }

XOR ( ^ )

XOR は同じビットは 0、そうでないなら 1。

1 int main (void)
2 {
3     unsigned short a = 12, b = 4, c;
4     c = a ^ b;
5     printf("a ^ b = %d\n", c); // c = 8
6 }

NOT ( ~ )

NOT はビットを反転させる。

1 int main (void)
2 {
3     unsigned short a = 65534, b;
4     b = ~a;
5     printf("b = %d\n", b); // b = 1
6 }

XOR での swap

XOR をオペレーターをしようすれば、余分な変数を使用する必要なく変数の値を交換できます。

 1 int main (void)
 2 {
 3     int a = 10;
 4     int b = -10;
 5     
 6     a = a ^ b;
 7     b = a ^ b;
 8     a = a ^ b;
 9 
10     printf("a = %d\n", a); // a = -10
11     printf("b = %d\n", b); // b = 10
12 }

ビットシフト (<<, >>)

ビットシフト操作は基本的に unsigned のデータに使用する。これは、ANSI C が、右シフトの際にゼロをシフトするか、MSBをシフトするかは、コンパイラ次第と規定しているため。unsigned の場合には、いつもゼロがシフトされる。

 1 int main (void)
 2 {
 3     unsigned short a = 3, b = 7, c = 32768, d;
 4 
 5     d = a << 3;
 6     printf("a << 3 = %d\n", d); // d = 24
 7     d = b >> 2;
 8     printf("b >> 2 = %d\n", d); // d = 1
 9     d = c >> 14;
10     printf("c >> 14 = %d\n", d); // d = 2
11 }