Pythonで行う2進数・16進数・ビット演算

Pythonで行う2進数・16進数・ビット演算
Pythonで行う2進数・16進数・ビット演算

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

ビットと数

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

py
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だけ大きい数である。

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

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

加算

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

OR演算

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

AND演算

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

XOR演算

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

ビットの反転

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

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

シフト演算

py
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の値を変換する。

参考 struct---バイト列をパックされたバイナリデータとして解釈する—Python3.7.9ドキュメント

文字バイトオーダサイズアラインメント
@nativenativenative
=nativestandardnone
<リトルエンディアンstandardnone
>ビッグエンディアンstandardnone
!ネットワーク(= ビッグエンディアン)standardnone
フォーマットCの型Pythonの型標準のサイズ
cchar長さ1の文字列1
bsigned charinteger1
Bunsigned charinteger1
?_Bool真偽値型(bool)1
hshortinteger2
Hunsigned shortinteger2
iintinteger4
Iunsigned intinteger4
llonginteger4
Lunsigned longinteger4
qlong longinteger8
Qunsigned long longinteger8
ffloatfloat4
ddoublefloat8
schar[]string
pchar[]string
Pvoid *integer

こちらの記事も参考に。

関連記事

 
最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

Python学習にオススメの本をご紹介!
Pandasでデータサイエンスはじめよう!
スクレイピングにオススメの書籍

▼ Beautiful Soup4を使ったWebクローリングをはじめ、表データをpandasやOpenPyXL、matplotでデータ解析、グラフ表示などのスクレイピングのやり方が分かりやすく説明されてます。図解が多いのでPython初心者の方でも読み進められる内容となってます。

関連記事