ビット演算

ビット演算は、データを構成する各ビットを

 

操作する演算です。

 


ビット演算子には、

 

● & : 論理積(AND)

 

● | : 論理和(OR)

 

● ^ : 排他的論理和(XOR)

 

● ~ : 各ビットを反転させる否定(NOT)

 

● << : 各ビットを左にシフトさせる

 

● >> : 各ビットを右にシフトさせる

 


ビット演算子はあまり使うことがないので、

 

忘れている人も多いと思います。

 


組み込みソフトウェア開発では

 

使わずにプログラムは書けません。

 

 

ぜひ使い方も含めて習得してください。

 


◆ & (AND)


&は、指定したビットをOFF(0)にします。

 

例)10101010 という1バイトのビット列の下位4ビットを OFF にする場合

 

10101010

11110000

-------------

10100000

 


◆ | (OR)


| は、指定したビットをON(1)にします。

 

例)10101010 という1バイトのビット列の上位4ビットを ON する場合
   

10101010
11110000
-------------
11111010

 


◆ ^ (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)が格納されることになります。

 


● 論理積(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)が格納されることになります。