アールグレー特売所

ゲームやら競プロやらのメモ書き

Python3でビット演算

全列挙や集合で役に立つビット演算についてまとめ。しばらく勘違いしていたけど、いちいち二進数に変換するコードを書かなくても、整数値に対して演算を行うことが出来る。このことに気づいていなくてしばらく回りくどいコードを書いていた。ビット演算子の取り扱い例はABC014B など。

 

1.AND

比較する二つの数の内、2進標記で同じ桁が両方とも1なら1を、それ以外では0を返す。

5 & 17

5と17の2進標記はそれぞれ0b101, 0b10001なので、上記の演算結果としては0b00001となり、10進標記で1が返される。

 

2.  OR

桁を比較したときに少なくとも一方が1であれば1を、それ以外では0を返す。

5 | 17

今度は演算結果として0b10101となるので、10進標記で21が返される。

 

3. XOR

桁を比較したときに、片方だけでセットされているビットを返す。つまり(1, 1), (0, 0)の場合は0を返し、(1, 0)の時は1を返す。

5 ^ 17

演算結果は0b10100になるので、10進標記で20を返す。

 

4. ビット反転

全てのビットを反転する。

~5

Pythonの場合000...0101が反転して111...1010になるそう。これが10進で出力されると-6になるらしが、理屈がまだよくわかっていません...

 

5. シフト

左、ないし右にビットを動かす。

5 << 1
17 >> 2

それぞれ5を左に1ビット分シフト、17を右に2ビット分シフトとなり、10進標記で10(0b1010), 4(0b100)が出力される。