その他のビット演算

最後に、右シフト、論理積以外のビット演算も確認しておきましょう。

左シフト

左シフトは、二進数の各ビットをMSB側(通常の二進数表記をした場合の左側)にずらす演算で、

(byte)(0b00100010<<5)Code language: Arduino (arduino)

のように<<という演算子で表されます。なお、上記の例でカッコで囲って(byte)を付けているのは、結果を8ビットに収めて符号無し整数とみなすようにするためです。

上記の例のうち、左シフト演算部分である0b00100010<<5 は、0b00100010(=34)を左に5つずらすことを意味し、

二進数の各ビット十進数表記
109876543210
元の値0010001034
左に1つシフト後の値0100010068
左に2つシフト後の値10001000136
左に3つシフト後の値100010000272
左に4つシフト後の値1000100000544
左に5つシフト後の値100010000001088

のように結果は0b10001000000(=1088)になります(上位ビットで空欄になっている場所には、実際には0が入っています)。

例のようにカッコで囲って(byte)を付けてると、このうち下位8ビットのみが取り出され、

二進数の各ビット十進数表記
76543210
元の値0010001034
左に1つシフト後の値0100010068
左に2つシフト後の値10001000136
左に3つシフト後の値0001000016
左に4つシフト後の値0010000032
左に5つシフト後の値0100000064

のように結果は0b01000000(=64)になります。

論理和(OR)

ビット演算における論理和(OR)は、2つの二進数の各ビットをビットごとに足し合わせる演算(ただし「1+1=1」とみなします)で、

0b01100111|0b00110001Code language: Arduino (arduino)

のように|という演算子で表されます。

論理和では、2つ二進数双方のビットのいずれかが1であれば結果のビットが1になり、どちらも0の場合にのみ0になります。表にまとめると以下のようになります。

入力値のビットの値出力値のビットの値
値その1値その2
000
011
101
111

例で示した0b01100111|0b00110001は、0b01100111(= 103 )と 0b00110001(= 49 )の論理和を取っており、

二進数の各ビット十進数表記
76543210
値その101100111103
値その20011000149
論理和01110111119

のように、どちらか一方でも1となっているビットが結果でも1となって0b01110111(=119)が得られます。

排他的論理和(XOR)

ビット演算における排他的論理和(XOR)は、先ほどの論理和(OR)と似ていますが「1+1=0」となる演算で、

0b01100111^0b00110001Code language: Arduino (arduino)

のように^という演算子で表されます。

論理和では、2つ二進数双方のビットが異なっている場合は結果のビットが1になり、同じ場合は0になります。表にまとめると以下のようになります。

入力値のビットの値出力値のビットの値
値その1値その2
000
011
101
110

例で示した0b01100111^0b00110001は、0b01100111(= 103 )と 0b00110001(= 49 )の排他的論理和を取っており、

二進数の各ビット十進数表記
76543210
値その101100111103
値その20011000149
論理和0101011086

のように値の異なるビットを抽出した結果 0b01010110(=86)が得られます。

ビット反転(NOT)

ビット反転(NOT)は、その名のとおり二進数の各ビットを反転させる演算で、

(byte)(~0b00100010)Code language: Arduino (arduino)

のように~という演算子で表されます。なお、カッコで囲って(byte)を付けているのは、結果を8ビットに収めて8ビット符号無し整数とみなすようにするためです。

上記の例では、

二進数の各ビット十進数表記
76543210
元の値0010001034
ビット反転値11011101221

のようになり、0b11011101(=221)という値が得られます。

なお、結果を8ビットに収めていない場合はさらに上位のビットも反転して「1」になります。

次の記事

関数とは