如何在Python中表示和处理n位向量?
我现在正在做一个作业,需要处理位向量,但我对如何在Python中做到这一点很不确定。位向量的位数可以从4位到20位。我之前从来没有接触过位向量,但我猜想可以创建一些无符号字节的数组,然后用常见的与(AND)、或(OR)、异或(XOR)操作来进行操作。
这里有一个重要的限制:我不能使用除了标准Python自带的库以外的任何库。
我想我知道在C语言中如何使用8位无符号字节的数组来做到这一点:比如说,要把一个全为零的数组的第18位变成1,我会这样做:my_bit_array[3] &= 1<<2。
但是因为Python是动态类型的,并且没有内置的数组类型,我该如何以一种“Python风格”的方式来实现呢?
另外,是否可以表示一个大小为20的位向量?我在想是否可以创建一个24位/3字节的向量,然后忽略那4位。
7 个回答
9
它有一些列表,你可以用布尔值来填充这些列表:
[False] * 20
45
我很惊讶居然没有人提到过 int
(或者在 Python 2 中的 long
)。int
可以非常大,你可以对它们使用位运算符,它们运行得很快,而且代码看起来就像 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.
我用这个处理过几百位长的位向量。
12
这个库叫做 BitVector,是用纯Python写的,专门用来满足你提到的需求。