Open1

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

tech_mwtech_mw

Pythonプログラミング能力認定試験2級(時期的にちょうど良いのが2級のみだったため)試験対策のため

その中でwebではほぼ使わないビット演算周り周りの問題が出てきたので、備忘録メモ
特にビットシフト(>>, <<)は公式を覚えてしまえば簡単に計算可

n進数変換と合わせると簡単に対応できます↓
https://zenn.dev/tech_mw/scraps/b70956b196fb58

ビット演算子一覧

演算子 説明
& ビットごとの 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