ビット演算は、数値を2進数表記(0と1の並び)として扱い、それを操作する方法です。普段のプログラミングではあまり意識する機会が少ないかもしれませんが、実は非常に効率的で便利な技術です。
目次
ビット演算を使うメリット
ビット演算を使うと、以下のようなメリットがあります:
- 高速で効率的: ハードウェアレベルで計算されるため、通常の演算より速い。
- メモリ節約: 少ないリソースで多くの情報を管理可能。
- 柔軟な操作: 特定のビットを簡単に操作できる。
- 広範な応用: 暗号化、画像処理、フラグ管理、ゲーム開発などで活躍。
これらの特徴を活かすと、効率的でパフォーマンスの高いプログラムを書くことができます。それでは、Pythonを使ったビット演算の基礎を見ていきましょう!
bin関数
この記事で頻出するbin
関数の説明を軽くします:
- python 備え付け関数
- 整数を二進数表現の文字列に変換できる
- 文字列冒頭に”
0b
“が付与される
詳しくはこちらの記事で解説しています。
1. AND(&): 両方が1なら1
AND
演算は、2つのビットが両方とも1の場合にだけ1になります。それ以外は0です。
Pythonコード例
x = 0b1101 # 13(2進数では 1101)
y = 0b1011 # 11(2進数では 1011)
result = x & y # AND演算
print(bin(x)) # 0b1101 # 演算前
print(bin(y)) # 0b1011 # 演算前
print(bin(result)) # 0b1001 # 結果(AND: 各ビットごとに 1かつ1 なら1)
ポイント
1101 AND 1011
→1001
各ビットを見て、1と1の箇所だけ1になる。
2. OR(|): どちらかが1なら1
OR
演算は、どちらか一方でも1の場合に1になります。それ以外は0です。
Pythonコード例
x = 0b1101 # 13(2進数では 1101)
y = 0b1011 # 11(2進数では 1011)
result = x | y # OR演算
print(bin(x)) # 0b1101 # 演算前
print(bin(y)) # 0b1011 # 演算前
print(bin(result)) # 0b1111 # 結果(OR: 各ビットごとに 1または1 なら1)
ポイント
1101 OR 1011
→1111
各ビットを見て、どちらかが1の箇所は1になる。
3. XOR(^): 異なるときだけ1
XOR
演算は、ビットが異なる場合に1になります。同じ場合は0です。
Pythonコード例
x = 0b1101 # 13(2進数では 1101)
y = 0b1011 # 11(2進数では 1011)
result = x ^ y # XOR演算
print(bin(x)) # 0b1101 # 演算前
print(bin(y)) # 0b1011 # 演算前
print(bin(result)) # 0b0110 # 結果(XOR: 各ビットごとに 異なる場合は1)
ポイント
1101 XOR 1011
→0110
各ビットを見て、異なるビットの箇所が1になる。
4. NOT(~): ビットをすべて反転
NOT
演算は、すべてのビットを反転します。0は1に、1は0になります。Pythonでは符号付き整数として扱われるため、結果は負の数になります。
Pythonコード例
x = 0b1101 # 13(2進数では 1101)
result = ~x # NOT演算
print(bin(x)) # 0b1101 # 演算前
print(bin(result)) # -0b1110 # 結果(NOT: すべてのビットを反転)
ポイント
1101 NOT
→1110
(ただし符号が付くため、-0b1110
として出力)- 13を2進数で表し、それをビット反転すると-14になる。14を2進数に表すと
1110
となりbinでは負の数を表す際はマイナスを冒頭に付ける。よって13のNOT(ビット反転)は-0b1110
(-14) である。
- 13を2進数で表し、それをビット反転すると-14になる。14を2進数に表すと
5. 左シフト(<<): ビットを左に移動
左シフトは、ビットを左に移動します。右側に空いた部分には0が入ります。結果として、数値が2倍になります。
Pythonコード例
x = 0b1101 # 13(2進数では 1101)
result = x << 1 # 左に1ビットシフト
print(bin(x)) # 0b1101 # 演算前
print(bin(result)) # 0b11010 # 結果(左にシフト、2倍)
ポイント
1101 << 1
→11010
右に0が追加されるため、2倍の値になります。
6. 右シフト(>>): ビットを右に移動
右シフトは、ビットを右に移動します。左側に空いた部分には0が入ります。結果として、数値が**2分の1(小数点以下切り捨て)**になります。
Pythonコード例
x = 0b1101 # 13(2進数では 1101)
result = x >> 1 # 右に1ビットシフト
print(bin(x)) # 0b1101 # 演算前
print(bin(result)) # 0b110 # 結果(右にシフト、2分の1)
ポイント
1101 >> 1
→110
左に空いた部分は0になるため、2分の1の値になります。
まとめ
ビット演算の特徴
- AND(&): 両方が1のときだけ1
- OR(|): どちらかが1なら1
- XOR(^): 異なる場合だけ1
- NOT(~): すべてのビットを反転
- 左シフト(<<): ビットを左に移動(2倍)
- 右シフト(>>): ビットを右に移動(2分の1)
ビット演算を学ぶメリット
- 高速で効率的: ハードウェアレベルで計算されるため、通常の計算よりも高速。
- メモリ節約: データをビット単位で管理するため、効率が良い。
- 幅広い応用: 暗号化、画像処理、フラグ管理などで活用。
まずは簡単な例から始め、実際にPythonで試してみると、ビット演算の動きが理解しやすくなります。ぜひ挑戦してみてください!