ビット演算子
ビット演算子とは整数型の数値に対してビット単位で演算を行うための演算子です。C言語を学習した当初はあまり利用することは無いと思いますので必要になった時点で参照して下さい。
具体的な例を元に確認していきます。「short int」型の値の場合、格納できる値は多くの処理系で2バイト(16ビット)の数値となります。そこで例えば10進数で「7」と言う数値を2進数で表現してみます。
10進数 7 2進数 0000000000000111
2進数では各位置が「0」か「1」の値となります。そぞれの値をビットと呼びます。ビット演算子は個々のビットに対して演算を行うための演算子です。ビット演算子の種類には次のものがあります。
演算子 | 記述例 | 意味 |
---|---|---|
& | a = b & 0x4F | ビットAND |
| | a = b | 0x0F | ビットOR |
^ | a = b ^ 0xFF | ビットXOR |
~ | a = ~a | ビットNOT |
<<= | a = a << 2 | 左シフト |
>>= | a = a >> 2 | 右シフト |
※記述例は変数の値が「short int」型を想定しています。
ビット演算子の中で左シフトと右シフトはシフト演算子とも呼ばれます。シフト演算子については次のページで確認します。
ではそれぞれの演算子について確認してみます。
ビットAND
ビットANDは演算子の左辺と右辺の同じ位置にあるビットを比較して、両方のビットが共に「1」の場合だけ「1」にします。
0000000000001011 = 11 0000000000001110 = 14 ---------------- 0000000000001010 = 10
上記では11(0x000B)と14(0x000E)のANDを取ると10(0x000A)となります。プログラムで実際に記述する場合は次のようになります。
short int a = 0x000B; a = a & 0x000E;
上記の演算の結果、変数「a」には10(0x000A)が格納されることになります。
ビットOR
ビットORは演算子の左辺と右辺の同じ位置にあるビットを比較して、両方のビットのどちらかが「1」の場合に「1」にします。
0000000000001011 = 11 0000000000001110 = 14 ---------------- 0000000000001111 = 15
上記では11(0x000B)と14(0x000E)のORを取ると15(0x000F)となります。プログラムで実際に記述する場合は次のようになります。
short int a = 0x000B; a = a | 0x000E;
上記の演算の結果、変数「a」には15(0x000F)が格納されることになります。
ビットXOR
ビットXORは演算子の左辺と右辺の同じ位置にあるビットを比較して、ビットの値が異なる場合にだけ「1」にします。
0000000000001011 = 11 0000000000001110 = 14 ---------------- 0000000000000101 = 5
上記では11(0x000B)と14(0x000E)のORを取ると5(0x0005)となります。プログラムで実際に記述する場合は次のようになります。
short int a = 0x000B; a = a ^ 0x000E;
上記の演算の結果、変数「a」には5(0x0005)が格納されることになります。
ビットNOT
ビットNOTは演算子の右辺の値の各ビットに対して「1」の場合は「0」に、「0」の場合は「1」にします。
0000000000001011 = 11 ---------------- 1111111111110100 = -12
※「short int」型の値を2進数で2の補数表現で行った場合、最上位ビットが「1」の値は負の数となります。
上記では11(0x000B)のNOTを取ると-12(0xFFF4)となります。プログラムで実際に記述する場合は次のようになります。
short int a = 0x000B; a = ~a;
上記の演算の結果、変数「a」には-12(0xFFF4)が格納されることになります。
サンプルプログラム
では簡単なサンプルプログラムを作成して試してみます。
#include <stdio.h> int main(void){ short int a; short int b; a = 11; b = 14; printf("%d AND %d = %d¥n", a, b, a & b); printf("%d OR %d = %d¥n", a, b, a | b); printf("%d XOR %d = %d¥n", a, b, a ^ b); printf("NOT %d = %d¥n", a, ~a); return 0; }
上記を「test6-1.c」の名前で保存します。まずコンパイルを行います。
コンパイルが終わりましたら「test6-1」と入力して実行します。
( Written by Tatsuo Ikura )