我如何在Python中表示和使用n位向量?

oli*_*ren 7 python bit-manipulation bitarray bitvector

在我正在进行的一项任务中,我们需要使用位向量,但我不确定如何在Python中执行此操作.它们应该能够从4位到20位.我以前从未使用过位向量,但我想可以创建一个使用通常的AND/OR/XOR操作操作的无符号字节数组.

这里的重要限制是:除了标准Python提供的库之外,我不能依赖任何库.

我想我知道如何使用8位无符号字节的数组在C中执行此操作:例如,将零数组的第18位转换为1,我会做类似my_bit_array [3]&= 1 << 2的操作

但由于Python是动态类型的,并且没有内置数组类型,我将如何以pythonic方式执行此操作?

是否有可能(如何?)表达大小为20的位向量?我在考虑制作一个24位/ 3字节向量并忽略4位.

jpk*_*tta 18

我很惊讶没有人提到过int(或者我猜long在Python 2中). ints可以是任意大的,你可以在它们上使用按位运算符,它们很快,而且代码看起来像是在C中钻出代码(我认为这是一个优势).

x = 0 # empty
x |= 1<<19 # set bit 19
x &= ~(1<<19) # clear bit 19
x ^= 1<<19 # toggle bit 19
x = ~x # invert *all* bits, all the way to infinity
mask = ((1<<20)-1) # define a 20 bit wide mask
x &= mask # ensure bits 20 and higher are 0
x ^= mask # invert only bits 0 through 19

(x >> 19) & 1 # test bit 19
(x >> 16) & 0xf # get bits 16 through 20.
Run Code Online (Sandbox Code Playgroud)

我已经将它用于数百位长的位向量.


ezo*_*zod 9

bitarray模块与布尔有效做到这一点.


Håv*_*d S 7

BitVector是用于此目的的纯Python库,应该适合您指定的需求.

  • 好图书馆。没用过,但是看了代码学到了很多。事实证明,在细节中,BitVector 的作者使用了一个(8 位)字节数组,就像我在思考的那样。 (3认同)

Ign*_*ams 6

它具有列表,您可以在其中填充以下内容:

[False] * 20
Run Code Online (Sandbox Code Playgroud)

  • 它将占用20 + 1个指针。正确和错误是单例。 (3认同)