ビット演算子

広告

ビット演算子とは整数に対してビット単位で演算を行うための演算子です。ビット演算子には次のものが用意されています。

演算子記述例意味
&a & bビットAND
|a | bビットOR
^a ^ bビットXOR
~~aビット反転
<<a << b左シフト
>>a >> b右シフト

ビット演算子の優先順位については「演算子の優先順位」を参照して下さい。

ビット演算子の中でも「<<」と「>>」は特にシフト演算子とも呼ばれます。こちらについては「シフト演算子」で解説します。

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

ビットAND

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

a & b

例として「11」と「14」のビットANDを取ってみます。

1011  = 11
1110  = 14
------------
1010  = 10

整数の「11」と「14」をそれぞれ2進数で表します。そして各ビットを比較しますがビットANDの場合は両方の値のビットが「1」になっている場合は「1」を、それ以外は「0」とします。その結果、2進数の「1010」(10進数の「10」)と言う結果を取得することが出来ます。

print 11 & 14    # 10

上記では結果として「10」が出力されます。

ビットOR

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

a | b

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

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

数値の「10」と「12」をそれぞれ2進数で表します。そして各ビットを比較しますがビットORの場合はどちらかの値のビットが「1」になっている場合は「1」を、それ以外は「0」とします。その結果、2進数の「1110」(10進数の「14」)と言う結果を取得することが出来ます。

print 10 | 12    # 14

上記では結果として「14」が出力されます。

ビットXOR

ビットXORは演算子の左辺と右辺の同じ位置にあるビットを比較して、ビットの値が異なる場合にだけ「1」にします。

a ^ b

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

1010  = 10
1100  = 12
------------
0110  = 6

数値の「10」と「12」をそれぞれ2進数で表します。そして各ビットを比較しますがビットXORの場合は2つの値のビットの値が異なっている場合は「1」を、それ以外は「0」とします。その結果、2進数の「0110」(10進数の「6」)と言う結果を取得することが出来ます。

print 10 ^ 12    # 6

上記では結果として「6」が出力されます。

ビット反転

ビット反転は演算子の右辺の値の各ビットに対して「1」の場合は「0」に、「0」の場合は「1」にします。

~ a

本来はビット反転はこのような意味ですが、Pythonにおいては整数の桁が無制限となっているため、反転を行う限度がありません。その為Pythonにおけるビット反転は次のように定められています。

-(a + 1)

元の値に1を加え、そして符号を反転させたものをビット反転演算子の結果と定められています。

print ~ 10    # -11

上記では結果として「-11」が出力されます。

サンプルコード

では実際に試してみます。

#coding: UTF-8

print "11 & 14 = ", 11 & 14
print "10 | 12 = ", 10 | 12
print "10 ^ 12 = ", 10 ^ 12
print "~ 10 = ", ~ 10

上記を「test4-1.py」として保存します。保存する時の文字コードはUTF-8です。そして次のように実行して下さい。

ビット演算子

( Written by Tatsuo Ikura )