その他のビット演算
最後に、右シフト、論理積以外のビット演算も確認しておきましょう。
左シフト
左シフトは、二進数の各ビットをMSB側(通常の二進数表記をした場合の左側)にずらす演算で、
(byte)(0b00100010<<5)
Code language: Arduino (arduino)
のように<<
という演算子で表されます。なお、上記の例でカッコで囲って(byte)
を付けているのは、結果を8ビットに収めて符号無し整数とみなすようにするためです。
上記の例のうち、左シフト演算部分である0b00100010<<5
は、0b00100010(=34)を左に5つずらすことを意味し、
二進数の各ビット | 十進数表記 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |||
元の値 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 34 | ||||
左に1つシフト後の値 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 68 | ||||
左に2つシフト後の値 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 136 | ||||
左に3つシフト後の値 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 272 | |||
左に4つシフト後の値 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 544 | ||
左に5つシフト後の値 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1088 |
のように結果は0b10001000000(=1088)になります(上位ビットで空欄になっている場所には、実際には0が入っています)。
例のようにカッコで囲って(byte)
を付けてると、このうち下位8ビットのみが取り出され、
二進数の各ビット | 十進数表記 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |||
元の値 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 34 | |
左に1つシフト後の値 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 68 | |
左に2つシフト後の値 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 136 | |
左に3つシフト後の値 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 16 | |
左に4つシフト後の値 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 32 | |
左に5つシフト後の値 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 64 |
のように結果は0b01000000(=64)になります。
論理和(OR)
ビット演算における論理和(OR)は、2つの二進数の各ビットをビットごとに足し合わせる演算(ただし「1+1=1」とみなします)で、
0b01100111|0b00110001
Code language: Arduino (arduino)
のように|
という演算子で表されます。
論理和では、2つ二進数双方のビットのいずれかが1であれば結果のビットが1になり、どちらも0の場合にのみ0になります。表にまとめると以下のようになります。
入力値のビットの値 | 出力値のビットの値 | |
---|---|---|
値その1 | 値その2 | |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
例で示した0b01100111|0b00110001
は、0b01100111(= 103 )と 0b00110001(= 49 )の論理和を取っており、
二進数の各ビット | 十進数表記 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |||
値その1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 103 | |
値その2 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 49 | |
論理和 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 119 |
のように、どちらか一方でも1となっているビットが結果でも1となって0b01110111(=119)が得られます。
排他的論理和(XOR)
ビット演算における排他的論理和(XOR)は、先ほどの論理和(OR)と似ていますが「1+1=0」となる演算で、
0b01100111^0b00110001
Code language: Arduino (arduino)
のように^
という演算子で表されます。
論理和では、2つ二進数双方のビットが異なっている場合は結果のビットが1になり、同じ場合は0になります。表にまとめると以下のようになります。
入力値のビットの値 | 出力値のビットの値 | |
---|---|---|
値その1 | 値その2 | |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
例で示した0b01100111^0b00110001
は、0b01100111(= 103 )と 0b00110001(= 49 )の排他的論理和を取っており、
二進数の各ビット | 十進数表記 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |||
値その1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 103 | |
値その2 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 49 | |
論理和 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 86 |
のように値の異なるビットを抽出した結果 0b01010110(=86)が得られます。
ビット反転(NOT)
ビット反転(NOT)は、その名のとおり二進数の各ビットを反転させる演算で、
(byte)(~0b00100010)
Code language: Arduino (arduino)
のように~
という演算子で表されます。なお、カッコで囲って(byte)
を付けているのは、結果を8ビットに収めて8ビット符号無し整数とみなすようにするためです。
上記の例では、
二進数の各ビット | 十進数表記 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |||
元の値 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 34 | |
ビット反転値 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 221 |
のようになり、0b11011101(=221)という値が得られます。
なお、結果を8ビットに収めていない場合はさらに上位のビットも反転して「1」になります。