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

こちらの記事も参考に

独学プログラマー Python言語の基本から仕事のやり方まで
独学プログラマー Python言語の基本から仕事のやり方まで

本書は「Pythonだけ」を学ぶ本ではありません。Pythonを使ってプログラミングを紹介していますが、伝えたい内容はPythonに限らない「プログラミング全般」の知識です。プログラマになるためのスキルを独学できる本です。Pythonプログラミングの基本を学べるだけでなく、プログラマとして必要なスキル(シェル、正規表現、パッケージ管理、バージョン管理、データ構造、アルゴリズム、仕事の始め方・やり方)もひと通り学べるのが特徴です。「プログラミングを始めたい」「できればその道でプロを目指してみたい」――そんな読者にオススメです。

KindleAmazon

最後まで読んでいただきありがとうございました。

「この記事が参考になったよ」という方は、ぜひ記事をシェアをしていただけるととても嬉しいです。

今後も有益な記事を書くモチベーションにつながりますので、どうかよろしくお願いいたします。↓↓↓↓↓↓↓

あなたにおすすめ