ビット演算に関する演算子

Python で用意されている数値型の値で利用可能な演算子の中で、ビット演算に関する演算子に関して解説します。

(Last modified: )

ビット演算に関する演算子

ビット演算に関する演算子の一覧です。ビット演算は整数でのみ利用可能です。

x | y    x と y のビット単位 論理和
x ^ y    x と y のビット単位 排他的論理和
x & y    x と y のビット単位 論理積
x << n   x の n ビット左シフト
x >> n   x の n ビット右シフト
~x       x のビット反転

ではそれぞれの演算子について確認してみます。

ビットOR

ビット OR は演算子の左辺と右辺の同じ位置にあるビットを比較して、少なくともビットのどちらかが 1 の場合に 1 にします。

x | y

例として 10 と 12 のビット OR を取ってみます。

10 | 12

1010  = 10
1100  = 12
------------
1110  = 14

10 と 12 を 2 進数で表示し、ビット単位で比較します。少なくとも 1 つのビットが 1 になっている場合は 1 、 それ以外は 0 となります。結果として 10 | 12 は 14 となります。

ビットAND

ビット AND は演算子の左辺と右辺の同じ位置にあるビットを比較して、両方のビットが 1 の場合に 1 にします。

x & y

例として 10 と 12 のビット AND を取ってみます。

10 & 12

1010  = 10
1100  = 12
------------
1000  = 08

10 と 12 を 2 進数で表示し、ビット単位で比較します。両方のビットが 1 になっている場合は 1 、 それ以外は 0 となります。結果として 10 & 12 は 8 となります。

ビットXOR

ビット XOR は演算子の左辺と右辺の同じ位置にあるビットを比較して、どちらか 1 つだけ 1 の場合に 1 にします。

x ^ y

例として 10 と 12 のビット XOR を取ってみます。

10 ^ 12

1010  = 10
1100  = 12
------------
0110  = 06

10 と 12 を 2 進数で表示し、ビット単位で比較します。どちらか片方だけのビットが 1 になっている場合は 1 、 それ以外は 0 となります。結果として 10 ^ 12 は 6 となります。

ビットNOT

ビット NOT は演算子の右辺の値のビットを反転します。ビットが 1 なら 0 、ビットが 0 なら 1 にします。

~x

例として 10 のビット NOT を取ってみます。

~10

1010  = 10
------------
0101  = 05

10 を 2 進数で表示し、ビットが 1 のところは 0 、ビットが 0 のところは 1 となります。結果として ~10 は 5(-11) となります。

Python においては整数の桁が無制限となっているため、反転を行う限度がありません。その為 Python におけるビット NOT は 2 の補数の計算方法を使って次のように行います。
~x = -(x + 1)

左シフト

左シフトは左辺の値を右辺の値だけ左へシフトします。

x << n

例として 11 を左へ 2 ビットシフトしてみます。

11 << 2

001011  = 11
------------
101100  = 44

各ビットを指定した数だけ左へシフトします。シフトしたことによって空いた右端には 0 が格納されます。結果として 11 << 2 は 44 となります。

左シフトを 1 ビット行うと値は 2 倍になり、 2 ビット行うと 4 倍となります。

右シフト

右シフトは左辺の値を右辺の値だけ右へシフトします。

x >> n

例として 11 を右へ 1 ビットシフトしてみます。

11 >> 1

1011  = 11
------------
0101  = 5

各ビットを指定した数だけ右へシフトします。シフトしたことによって空いた左端には 0 が格納されます。結果として 11 >> 1 は 5 となります。

右シフトを 1 ビット行うと値は 1/2 倍になり、 2 ビット行うと 1/4 倍となります。

サンプルコード

次のサンプルを見てください。

print("10 | 12 = " + str(10 | 12))
>> 10 | 12 = 14

print("10 & 12 = " + str(10 & 12))
>> 10 & 12 = 8

print("10 ^ 12 = " + str(10 ^ 12))
>> 10 ^ 12 = 6

print("~10 = " + str(~10))
>> ~10 = -11

print("11 << 2 = " + str(11 << 2))
>> 11 << 2 = 44

print("11 >> 1 = " + str(11 >> 1))
>> 11 >> 1 = 5

それぞれのビット演算を行った結果について出力しました。

-- --

Python で用意されている数値型の値で利用可能な演算子の中で、ビット演算に関する演算子に関して解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。