Python ビット演算子
1. ビット演算子の概要
ビット演算子(Bitwise Operators)は、数値(バイナリ)をビット単位で比較するために使用されます。
| 演算子 | 名称 | 説明 | 例 |
|---|---|---|---|
& | AND | 両方のビットが 1 の場合に、各ビットを 1 に設定します。 | x & y |
| | OR | 2つのビットのうち少なくとも一方が 1 の場合に、各ビットを 1 に設定します。 | x | y |
^ | XOR | 2つのビットのうち一方のみが 1 の場合に、各ビットを 1 に設定します。 | x ^ y |
~ | NOT | すべてのビットを反転させます。 | ~x |
<< | ゼロ埋め左シフト | 右側からゼロを押し込み、左側のビットを溢れさせることで左へシフトします。 | x << 2 |
>> | 符号あり右シフト | 左側から左端のビットのコピーを押し込み、右側のビットを溢れさせることで右へシフトします。 | x >> 2 |
2. AND 演算子 (&)
& 演算子は、両方のビットが 1 の場合にのみ、結果のビットを 1 に設定します。
例:
6 のバイナリは 0110、3 のバイナリは 0011 です。この 2 つを & で比較すると、両方が 1 であるビットは右から 2 番目のみとなり、結果は 0010(すなわち 2)になります。
print(6 & 3)
"""
6 = 0000000000000110
3 = 0000000000000011
--------------------
2 = 0000000000000010
"""3. OR 演算子 (|)
| 演算子は、2つのビットのうち少なくとも一方が 1 であれば、結果のビットを 1 に設定します。
例:
6(0110)と 3(0011)を | で比較すると、1、2、3 番目のビットが 1 となり、結果は 0111(すなわち 7)になります。
print(6 | 3)
"""
6 = 0000000000000110
3 = 0000000000000011
--------------------
7 = 0000000000000111
"""4. XOR 演算子 (^)
^ 演算子は、2つのビットのうち「一方のみ」が 1 の場合に、結果のビットを 1 に設定します。両方が 1 または両方が 0 の場合は 0 になります。
例:
6(0110)と 3(0011)を ^ で比較すると、1 番目と 3 番目のビットが 1 となり、結果は 0101(すなわち 5)になります。
print(6 ^ 3)
"""
6 = 0000000000000110
3 = 0000000000000011
--------------------
5 = 0000000000000101
"""5. NOT 演算子 (~)
~ 演算子はビットを反転させます(1 は 0 に、0 は 1 になります)。
Python における ~x の結果は、数学的には -(x + 1) と等しくなります。
例:
数値 3 のビットを反転させる例です。
print(~3)
"""
3 = 0000000000000011
--反転--
-4 = 1111111111111100
"""6. ゼロ埋め左シフト (<<)
<< 演算子は、指定したビット数分だけ左にシフトします。右側からは 0 が補充され、左側から溢れたビットは破棄されます。
例:
3(0011)を 2 ビット左にシフトすると、1100(すなわち 12)になります。
print(3 << 2)
"""
3 = 0000000000000011
--2ビット左シフト--
12 = 0000000000001100
"""7. 符号あり右シフト (>>)
>> 演算子は、指定したビット数分だけ右にシフトします。左側からは左端のビット(符号ビット)と同じ値が補充され、右側から溢れたビットは破棄されます。
例:
8(1000)を 2 ビット右にシフトすると、0010(すなわち 2)になります。
print(8 >> 2)
"""
8 = 0000000000001000
--2ビット右シフト--
2 = 0000000000000010
"""