ビット演算とは
ビット演算とは、整数に対してビット単位で論理演算を行う演算子です。とは言ってもそもそもビットって何?という説明から、ビットとはBInary digiTに語源をもつコンピュータが処理する最小の単位のこと。余計難しくなりましたね。
単純に説明すると整数を2進数で表示したときの一桁、一桁のことをビット(bit)と言います。2進数なので必ず0か、1になっており、2進数の桁ごとに論理演算することをビット演算と呼びます。では具体的に見ていきましょう。
ビット演算子の種類
ビット演算子とは整数に対してビット単位で演算を行うための演算子です。ビット演算子には次のものが用意されています。演算子 | 記述例 | 意味 |
---|---|---|
& | a & b | ビットAND |
| | a | b | ビットOR |
^ | a ^ b | ビットXOR |
~ | ~a | ビット反転 |
<< | a << b | 左シフト |
>> | a >> b | 右シフト |
ではそれぞれの演算子について確認してみましょう。
ビットAND
ビットANDは演算子の左辺と右辺の同じ位置にあるビットを比較して、両方のビットが共に「1」の場合だけ「1」にします。例として"11"と"12"の演算をしてみます。
2進数 10進数
1011 = 「11」
1100 = 「12」
------------
1000 = 「8」
整数の「11」と「12」をそれぞれ2進数で表します。そして各ビットを比較しますがビットANDの場合は両方の値のビットが「1」になっている場合は「1」を、それ以外は「0」とします。結果"1000"になり10進数では"8"になります。インタラクティブシェルを使って試してみましょう。
>>> 11 & 12
8
ビットOR
ビットORは演算子の左辺と右辺の同じ位置にあるビットを比較して、両方のビットのどちらかが「1」の場合に「1」にします。例として"9"と"12"の演算をしてみます。
2進数 10進数
1001 = 「9」
1100 = 「12」
------------
1101 = 「13」
数値の「9」と「12」をそれぞれ2進数で表します。そして各ビットを比較しますがビットORの場合はどちらかの値のビットが「1」になっている場合は「1」を、それ以外は「0」とします。結果"1101"になり10進数では"13"になります。インタラクティブシェルを使って試してみましょう。
>>> 9 | 12
13
ビットXOR
ビットXORは演算子の左辺と右辺の同じ位置にあるビットを比較して、ビットの値が異なる場合にだけ「1」にします。例として"11"と"14"の演算をしてみます。
2進数 10進数
1011 = 「11」
1110 = 「14」
------------
0101 = 「5」
整数の「11」と「14」をそれぞれ2進数で表します。そして各ビットを比較しますがビットXORの場合は2つの値のビットの値が異なっている場合は「1」を、それ以外は「0」とします。結果"0101"になり10進数では"5"になります。インタラクティブシェルを使って試してみましょう。
>>> 11 ^ 14
5
ビット反転
ビット反転は演算子の右辺の値の各ビットに対して「1」の場合は「0」に、「0」の場合は「1」にします。 本来はビット反転はこのような意味ですが、実際には下記のように整数の桁が無制限となってしまいます。例えばとして"7"の反転は
2進数 10進数
0111 = 「7」
------------
1000 = 「8」
11000 = 「24」
111000 = 「56」
1111000 = 「120」
11111000 = 「248」
・
・
・
以上のように定まりません。その為IronPythonにおけるビット反転は次のように定められています。
~a = -(a + 1)
これはコンピュータ内の論理の勝手な決まりなのです。例えば8ビットしか扱えない2進数変数で「11111111」は普通に考えると"255"ですが、「1」足すと「00000000」になり、"0"になるため、「11111111」は"-1"とも考えられます。IronPythonは後者の結果に基づいてビット反転を行います。
インタラクティブシェルで試すと次のように
>>> ~7
8
左シフト
左シフト演算子は左辺の数値を右辺の値だけ左へシフトします。例として"11"を左に2ビットシフトしてみます。
2進数 10進数
00001011 = 「11」
------------
00101100 = 「44」
各ビットを指定した数だけ左へシフトします。左端からはみ出した部分は削除され、シフトしたことによって空いた右端は「0」が格納されます。結果として11を2ビット左へシフトすると44となります。
インタラクティブシェルを使って試してみましょう。
>>> 11 << 2
44
右シフト
右シフト演算子は左辺の数値を右辺の値だけ右へシフトします。例として"44"を左に1ビットシフトしてみます。
2進数 10進数
00101100 = 「44」
------------
00010110 = 「22」
各ビットを指定した数だけ右へシフトします。右端からはみ出した部分は削除され、シフトしたことによって空いた右端には、元々の値が「1」だった場合は「1」が格納され、「0」だった場合は「0」が格納されます。 結果として44を1ビット右へシフトすると22となります。
インタラクティブシェルを使って試してみましょう。