1

次のような64ビットのデータ構造があります。

HHHHHHHHHHHHHHGGGGGGGGGGGGFFFEEEEDDDDCCCCCCCCCCCCBAAAAAAAAAAAA

A: 12 ビット (符号なし)
B: 1 ビット
C: 12 ビット (符号なし)
D: 4 ビット (符号なし)
E: 4 ビット (符号なし)
F: 3 ビット (符号なし)
G: 12 ビット (符号なし)
H: 16 ビット(無署名)

Python を使用して、どのモジュール (できればネイティブの Python 3.x) を使用する必要があるかを判断しようとしています。私はBitVectorを見ていますが、いくつかのことを理解するのに苦労しています。

使いやすくするために、次のようなことができるようにしたいと考えています。

# To set the `A` bits, use a mapped mask 'objectId'
bv = BitVector(size=64)
bv['objectId'] = 1

BitVector が実際に希望どおりに機能するかどうかはわかりません。最終的に実装するモジュールが何であれ、データ構造は、プロパティのゲッター/セッターを介して構造を読み書きするクラスにカプセル化されます。

一部のビット値には定数 (または列挙型) も使用します。次のようなものを使用してマップされたマスクを設定できると便利です。

# To set the 'B' bit, use the constant flag to set the mapped mask 'visibility'
bv['visibility'] = PUBLIC  
print(bv['visibility']) # output: 1  

# To set the 'G' bits, us a mapped mask 'imageId'
bv['imageId'] = 238  

この目標を達成するのに役立つ 3.x の Python モジュールはありますか? BitVector が機能する (または機能する必要がある) 場合は、役立つヒント (例など) をいただければ幸いです。BitVector は、私のアプリケーション (IMHO) にとって理想的ではない 8 ビット形式にすべてを強制したいと考えているようです。

4

1 に答える 1

0

bitarrayを使用するという推奨事項に基づいて、2 つのユーティリティ メソッドを使用した次の実装を考え出しました。

def test_bitvector_set_block_id_slice(self):
    bv = bitvector(VECTOR_SIZE)
    bv.setall(False)

    print("BitVector[{len}]: {bv}".format(len=bv.length(),
                                          bv=bv.to01()))
    print("set block id: current {bid} --> {nbid}".format(bid=bv[52:VECTOR_SIZE].to01(),
                                                          nbid=inttobitvector(12, 1).to01()))

    # set blockVector.blockId (last 12 bits)
    bv[52:VECTOR_SIZE] = inttobitvector(12, 1)

    block_id = bv[52:VECTOR_SIZE]

    self.assertTrue(bitvectortoint(block_id) == 1)
    print("BitVector[{len}] set block id: {bin} [{val}]".format(len=bv.length(),
                                                                bin=block_id.to01(),
                                                                val=bitvectortoint(block_id)))
    print("BitVector[{len}]: {bv}".format(len=bv.length(),
                                          bv=bv.to01()))
    print()

# utility methods
def bitvectortoint(bitvec):
    out = 0
    for bit in bitvec:
        out = (out << 1) | bit

    return out


def inttobitvector(size, n):
    bits = "{bits}".format(bits="{0:0{size}b}".format(n,
                                                      size=size))

    print("int[{n}] --> binary: {bits}".format(n=n,
                                               bits=bits))

    return bitvector(bits)

出力は次のとおりです。

BitVector[64]: 0000000000000000000000000000000000000000000000000000000000000000
int[1] --> binary: 000000000001
set block id: current 000000000000 --> 000000000001
int[1] --> binary: 000000000001
BitVector[64] set block id: 000000000001 [1]
BitVector[64]: 0000000000000000000000000000000000000000000000000000000000000001

ユーティリティ メソッドに改善点がある場合は、喜んでアドバイスをいたします。

于 2016-02-08T21:20:33.573 に答える