Open1
【Python試験対策】ビット演算子まとめ(&、|、^、~、<<、>>)

Pythonプログラミング能力認定試験2級(時期的にちょうど良いのが2級のみだったため)試験対策のため
その中でwebではほぼ使わないビット演算周り周りの問題が出てきたので、備忘録メモ
※ 特にビットシフト(>>
, <<
)は公式を覚えてしまえば簡単に計算可
n進数変換と合わせると簡単に対応できます↓
ビット演算子一覧
演算子 | 説明 |
---|---|
& |
ビットごとの AND(両方 1 のとき 1) |
| |
ビットごとの OR(どちらかが 1 なら 1) |
^ |
ビットごとの XOR(異なれば 1、同じなら 0) |
~ |
ビットごとの NOT(ビットを反転、結果は -(x+1) と同じ) |
<< |
左シフト(a << n == a * (2 ** n) ) |
>> |
右シフト(a >> n == a // (2 ** n) ) |
AND(&), OR(|), XOR(^)
a = 0b1100
b = 0b1010
print(a & b) # 8 (0b1000)
print(a | b) # 14 (0b1110)
print(a ^ b) # 6 (0b110)
NOT(~)
公式:
~x == -(x + 1)
サンプル:
a = 0b0011 # 3
# -(3 + 1)
print(~a) # -4
b = 5
# -(5 + 1)
print(~b) # -6
c = -6
# -(-6 + 1)
print(~c) # 5
d = -3
# -(-3 + 1)
print(~d) # 2
左シフト(<<)
当初は進数でシフト計算していたのですが計算式の方が簡単だったので今回は計算式を採用しました
計算式:
a << n == a × (2 ** n)
サンプル:
a = 0b1100 # 12
# 12(0b1100) × (2 ** 2)
print(a << 3) # 96
b = 0b0101 # 5
# 5(0b0101) × (2 ** 1)
print(b << 1) # 10
右シフト(>>)
当初は進数でシフト計算していたのですが計算式の方が簡単だったので今回は計算式を採用しました
計算式:
a >> n == a // (2 ** n)
サンプル:
a = 0b1001 # 9
# 9(0b1001) // (2 ** 2)
print(a >> 2) # 2
b = 0b111100 # 60
# 60(0b111100) // (2 ** 4)
print(b >> 4) # 3
c = -18 # -0b10010
# -18(-0b10010) // (2 ** 2)
print(c >> 2) # -5(値が-の場合より小さい方にまとまる)
複合例
x = 0b1001
y = 0b0110
# ① x & y = 0b0000
# ② 0b0000 << 2 = 0(0b0000) × (2 ** 2)
print((x & y) << 2) # 0
x = 0b1111
# ① 0b1111 ^ 0b1010 = 0b0101
# ② 0b0101 >> 1 = 5(0b0101) // (2 ** 1)
print((x ^ 0b1010) >> 1) # 2
x = 0b0010
y = 0b0001
# ① x | y = 0b0011(3)
# ② ~3 = -4
print(~(x | y)) # -4