私はしばらくの間、これに関していくつかの本当の問題を抱えています。Pythonでバイナリデータの文字列を受信していますが、データの5ビットサブセット(バイト全体ではない)のみを解凍して解釈するのに問題があります。頭に浮かぶ方法は、単に惨めに失敗するだけのようです。
2バイトのパックされたバイナリデータがあり、16内の最初の10ビットを解釈したいとします。これをそれぞれ5ビットを表す2つの整数に変換するにはどうすればよいですか?
ビットマスクとビットシフトを使用します。
>>> example = 0x1234 # Hexadecimal example; 2 bytes, 4660 decimal.
>>> bin(example) # Show as binary digits
'0b1001000110100'
>>> example & 31 # Grab 5 most significant bits
20
>>> bin(example & 31) # Same, now represented as binary digits
'0b10100'
>>> (example >> 5) & 31 # Grab the next 5 bits (shift right 5 times first)
17
>>> bin(example >> 5 & 31)
'0b10001'
ここでの秘訣は、31が5ビットのビットマスクであることを知ることです。
>>> bin(31)
'0b11111'
>>> 0b11111
31
>>> example & 0b11111
20
0b
ご覧のとおり、操作が簡単な場合は、2進数のリテラル表記を使用することもできます。
背景情報の詳細については、ビット操作に関するPythonWikiを参照してください。