101010

プログラミング備忘録とともに、ポエムってます。

2進数、16進数、ビット演算を理解する | Python

f:id:araemonz:20190504142359p:plain

Python3で行うものとする。 Python2系とPython3系ではビットの扱いにかなり違いがあるので注意すること。

ビットと数

つぎのプログラムは各ビットにおける最大長を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()
======= 1bit =======
1 0b1 0x1

======= 2bit =======
3 0b11 0x3

======= 3bit =======
7 0b111 0x7

======= 4bit =======
15 0b1111 0xf

======= 5bit =======
31 0b11111 0x1f

======= 6bit =======
63 0b111111 0x3f

======= 7bit =======
127 0b1111111 0x7f

======= 8bit =======
255 0b11111111 0xff

======= 9bit =======
511 0b111111111 0x1ff

======= 10bit =======
1023 0b1111111111 0x3ff

======= 11bit =======
2047 0b11111111111 0x7ff

======= 12bit =======
4095 0b111111111111 0xfff

======= 13bit =======
8191 0b1111111111111 0x1fff

======= 14bit =======
16383 0b11111111111111 0x3fff

======= 15bit =======
32767 0b111111111111111 0x7fff

======= 16bit =======
65535 0b1111111111111111 0xffff

======= 17bit =======
131071 0b11111111111111111 0x1ffff

======= 18bit =======
262143 0b111111111111111111 0x3ffff

======= 19bit =======
524287 0b1111111111111111111 0x7ffff

======= 20bit =======
1048575 0b11111111111111111111 0xfffff

======= 21bit =======
2097151 0b111111111111111111111 0x1fffff

======= 22bit =======
4194303 0b1111111111111111111111 0x3fffff

======= 23bit =======
8388607 0b11111111111111111111111 0x7fffff

======= 24bit =======
16777215 0b111111111111111111111111 0xffffff

======= 25bit =======
33554431 0b1111111111111111111111111 0x1ffffff

======= 26bit =======
67108863 0b11111111111111111111111111 0x3ffffff

======= 27bit =======
134217727 0b111111111111111111111111111 0x7ffffff

======= 28bit =======
268435455 0b1111111111111111111111111111 0xfffffff

======= 29bit =======
536870911 0b11111111111111111111111111111 0x1fffffff

======= 30bit =======
1073741823 0b111111111111111111111111111111 0x3fffffff

======= 31bit =======
2147483647 0b1111111111111111111111111111111 0x7fffffff

======= 32bit =======
4294967295 0b11111111111111111111111111111111 0xffffffff

ビット演算

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

構造体パッキング

7.3. struct --- 文字列データをパックされたバイナリデータとして解釈する — Python 2.7.16 ドキュメント

Python の値と Python 上で文字列データとして表される C の構造体データとの間の変換を実現します。 struct.pack(fmt, v1, v2, ...) フォーマット文字列 fmt に従い値 v1, v2, ... をパックして、文字列で返します。引数は指定したフォーマットが要求する型と正確に一致していなければなりません。

文字 バイトオーダ サイズ アラインメント
@ 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