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が充てんされます。