18

私が現在取り組んでいる課題では、ビットベクトルを操作する必要がありますが、Pythonでこれを行う方法がよくわかりません。それらは4ビットから20ビットまでである必要があります。私はこれまでビットベクトルを使用したことがありませんが、通常のAND / OR/XOR演算を使用して操作した符号なしバイトの配列を作成すると思います。

ここでの重要な制限は次のとおりです。標準のPythonで提供されているライブラリ以外のライブラリには依存できません

8ビットの符号なしバイトの配列を使用してCでこれを行う方法を知っていると思います。たとえば、ゼロ化された配列の18番目のビットを1に変換するには、my_bit_array [3]&= 1<<2のようにします。

しかし、Pythonは動的型付けされており、配列型が組み込まれていないため、Pythonの方法でこれを行うにはどうすればよいでしょうか。

そして、サイズ20のビットベクトルを表現することは(どのように?)可能ですか?私はおそらく24ビット/3バイトのベクトルを作成し、4ビットを無視することを考えています。

4

7 に答える 7

10

ライブラリBitVectorは、この目的のための純粋なPythonライブラリであり、指定したニーズに適合する必要があります。

于 2010-01-27T15:01:19.403 に答える
9

それはあなたがboolsで移入することができるリストを持っています:

[False] * 20
于 2010-01-27T15:00:49.297 に答える
9

bitarrayモジュールはこれをブール値で効率的に行います

于 2010-01-27T15:02:15.003 に答える
3

構造体モジュールを使用します。

于 2010-01-27T15:00:52.230 に答える
2

少し古いですが、比較のために別の stdlib オプションをここに残しておきます。ctypesモジュールを使用してこれを行うのも簡単です。

例えば:

そして、サイズ 20 のビットベクトルを表現することは (どのように?) 可能ですか? おそらく24ビット/ 3バイトのベクトルを作成し、4ビットを無視することを考えています。

class Simple(ctypes.LittleEndianStructure):
    _pack_ = 1
    _fields_ = [
                 ('one', ctypes.c_ubyte, 8),
                 ('two', ctypes.c_ubyte, 8),
                 ('three', ctypes.c_ubyte, 8)
               ]

s = Simple(0, 2, 256)
bytearray(s)        # bytearray(b'\x00\x02\x00')
s = Simple(0, 2, 255)
bytearray(s)        # bytearray(b'\x00\x02\xff')

class Simple(ctypes.BigEndianStructure):
    _pack_ = 1
    _fields_ = [
                 ('one', ctypes.c_ubyte, 8),
                 ('two', ctypes.c_ubyte, 8),
                 ('three', ctypes.c_ubyte, 8)
               ]

s = Simple(0, 2, 256)
bytearray(s)        # bytearray(b'\x00\x02\x00')
s = Simple(0, 2, 255)
bytearray(s)        # bytearray(b'\x00\x02\xff')

s.two |= 3
bytearray(s)        # bytearray(b'\x00\x03\xff')

または、次のようなより簡単なもの:

class bit_vector(Structure):
    _fields_ = [('bits', c_uint32, 24),
                ('unused', c_uint32, 8),
                ]

bv = bit_vector()
# turn on the 18th bit -- being explicit just to demo it
bv.bits |= int('000000000000000001000000', 2)
bin(bv.bits)   # 0b1000000
于 2016-11-01T17:06:16.920 に答える
1

純粋な Python python-bitstring (Python 3 をサポート) もあります。

于 2012-10-12T12:20:37.363 に答える