Pythonでビット演算

 

Pythonでビット演算
Pythonでビット演算

この記事では、2進数・16進数・ビット演算をPython3で試しながら理解を深めていく。Python2.xとPython3.xでは、ビットの扱いにかなり違いがあるので注意する必要がある。

ビットと数

このプログラムは、1ビットから32ビットまでの各ビットにおける最大長を、10進数・2進数・16進数で表示するプログラムである。

for i in range(2, 34):
    n = i - 1
    print("======= {bit}bit =======".format(bit=n))
    deci = pow(2, n) - 1
    print(deci, bin(deci), hex(deci))
    print()

プログラムの結果を表にしてみよう。

bit10進数2進数16進数
110b10x1
230b110x3
370b1110x7
4150b11110xf
5310b111110x1f
6630b1111110x3f
71270b11111110x7f
82550b111111110xff
95110b1111111110x1ff
1010230b11111111110x3ff
1120470b111111111110x7ff
1240950b1111111111110xfff
1381910b11111111111110x1fff
14163830b111111111111110x3fff
15327670b1111111111111110x7fff
16655350b11111111111111110xffff
171310710b111111111111111110x1ffff
182621430b1111111111111111110x3ffff
195242870b11111111111111111110x7ffff
2010485750b111111111111111111110xfffff
2120971510b1111111111111111111110x1fffff
2241943030b11111111111111111111110x3fffff
2383886070b111111111111111111111110x7fffff
24167772150b1111111111111111111111110xffffff
25335544310b11111111111111111111111110x1ffffff
26671088630b111111111111111111111111110x3ffffff
271342177270b1111111111111111111111111110x7ffffff
282684354550b11111111111111111111111111110xfffffff
295368709110b111111111111111111111111111110x1fffffff
3010737418230b1111111111111111111111111111110x3fffffff
3121474836470b11111111111111111111111111111110x7fffffff
3242949672950b111111111111111111111111111111110xffffffff

ビット演算

ここからはPython3で、基本的なビット演算を行っていく。

変数の定義

次のように変数を定義した。変数baよりも1だけ大きい数である。

a = 0b1111111  # 0x7f
b = 0b10000000  # 0x80
c = 0b10101010 

assert a == 127, a
assert b == 128, b

加算

s = bin(a + 1)
assert s == bin(b), s

OR演算

s = bin(a | b)
assert s == bin(0xff), s

AND演算

s = bin(a & b)
assert s == bin(0), s

XOR演算

s = bin(b ^ c)
assert s == bin(0b101010), s

ビットの反転

ただし、Pythonは整数の桁が無制限のため注意が必要。

s = ~a
assert s == -(a + 1), s

シフト演算

s = bin(a << 2)
assert s == bin(0b111111100), s

s = bin(b >> 4)
assert s == bin(0b1000), s

s = bin(b >> 10)
assert s == bin(0b0), s

構造体パッキング

structモジュールを使うと、Pythonの値とPython bytesオブジェクトとして表されるC言語の構造体データとの間の変換できるようになる。バイナリーデータを扱うときは、次の表のCとPythonとの対応が重要となってくる。structモジュールでは、書式文字列をつかってCとPythonの値を変換する。

参考

文字 バイトオーダ サイズ アラインメント
@ native native native
= native standard none
< リトルエンディアン standard none
> ビッグエンディアン standard none
! ネットワーク(= ビッグエンディアン) standard none
フォーマット Cの型 Pythonの型 標準のサイズ
c char 長さ1の文字列 1
b signed char integer 1
B unsigned char integer 1
? _Bool 真偽値型(bool) 1
h short integer 2
H unsigned short integer 2
i int integer 4
I unsigned int integer 4
l long integer 4
L unsigned long integer 4
q long long integer 8
Q unsigned long long integer 8
f float float 4
d double float 8
s char[] string
p char[] string
P void * integer

こちらの記事も参考に。

記事に関するご質問などがあればTwitterへお返事ください。
この記事で紹介した商品
Python学習にオススメの本
関連記事