ビット演算子 | Python入門

Pythonには他のプログラミング言語と同様、ビット演算子があります。

ビット演算子は整数にしか適用できません。

ここでは整数を表すのに少ない桁数の2進数を使っていますが、実際の整数型は多くのビットを持っています。そしてコンピューターは負の整数を表すのに2の補数表現を使うことを知っている必要があります。

ビット論理演算子

Pythonのビット論理演算子には次のものがあります。これらはビット単位で論理演算を実行します。

&
論理積(AND)
|
論理和(OR)
^
排他的論理和(XOR)
~
ビット反転

それぞれの演算はビット単位で次のようになります。

論理積の演算
左側被演算子 右側被演算子 論理積の結果
0 0 0
1 0 0
0 1 0
1 1 1

論理積では両方の被演算子が1のときだけ結果は1になります。

論理和の演算
左側被演算子 右側被演算子 論理和の結果
0 0 0
1 0 1
0 1 1
1 1 1

論理和は少なくと一方の被演算子が1なら結果は1になります。

排他的論理和の演算
左側被演算子 右側被演算子 排他的論理和の結果
0 0 0
1 0 1
0 1 1
1 1 0

排他的論理和はいずれか一方の被演算子が1のときに結果は1になります。

ビット反転の演算
被演算子 ビット反転の結果
0 1
1 0

ビット反転は1なら0、0なら1になります。

0b0101(10進数で5)と0b0011(10進数で3)でのそれぞれの演算結果は次のようになります。

>>> 0b0101 & 0b0011
1
>>> 0b0101 | 0b0011
7
>>> 0b0101 ^ 0b0011
6
>>> ~ 0b0
-1
  

論理積の演算では結果は1(0b0001)、論理和での結果は7(0b0111)、排他的論理和での結果は6(0b0110)となります。0b0(10進数で0)はすべてのビットが0ですので、これを反転するとすべてにビットが1(つまり-1)になります。

ビットシフト演算子

シフト演算子には次のものがあります。

<<
左シフト
>>
右シフト

シフト演算はビットの桁を移動する操作です。

>>> 0b0001 << 2
4

2番目の被演算子は何桁シフトするかを指定します。この例では2桁左シフトするので結果は4(0b0100)になります。左シフトした後の空いた最下位のビットには0が充填されます。

>>> 0b0100 >> 2
1

右シフトの演算は右へビットをシフトします。右シフト演算では符号はそのまま保持するようにシフトします。つまり、2の補数表現で最上位ビットは符号を表す(正なら0、負なら1)ので、シフトした後の空いた最上位ビットには正なら0、負なら1が充てんされます。