Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中表示和使用n位向量?_Python_Bit Manipulation_Bitarray_Bitvector - Fatal编程技术网

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

如何在Python中表示和使用n位向量?,python,bit-manipulation,bitarray,bitvector,Python,Bit Manipulation,Bitarray,Bitvector,在我目前正在做的一个作业中,我们需要使用位向量,但我不确定如何在Python中做到这一点。它们应该能够从4位到20位。我以前从未使用过位向量,但我想应该创建一个无符号字节数组,您可以使用常用的AND/OR/XOR操作来操作它 这里的重要限制是:除了标准Python提供的库之外,我不能依赖任何库 我想我知道如何使用8位无符号字节数组在C中实现这一点: e、 g.要将调零数组的第18位转换为1,我将执行以下操作 my_bit_array[3]&=1它有列表,您可以用布尔值填充这些列表: [False

在我目前正在做的一个作业中,我们需要使用位向量,但我不确定如何在Python中做到这一点。它们应该能够从4位到20位。我以前从未使用过位向量,但我想应该创建一个无符号字节数组,您可以使用常用的AND/OR/XOR操作来操作它

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

我想我知道如何使用8位无符号字节数组在C中实现这一点: e、 g.要将调零数组的第18位转换为1,我将执行以下操作
my_bit_array[3]&=1它有列表,您可以用布尔值填充这些列表:

[False] * 20

使用模块。

出于此目的,该库是一个纯Python库,应该适合您指定的需要。

该模块使用布尔函数有效地实现了这一点。

还有纯Python(支持Python 3)。

有点过时,但为了比较起见,我将在这里留下另一个stdlib选项。使用模块也很容易做到这一点

例如:

有可能(如何)表达一个大小为20的位向量吗? 我想做一个24位/3字节的向量,忽略4位 点点滴滴

或者更直截了当地说:

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

我很惊讶没有人提到
int
s(或者我猜在python2中是
long
)<代码> int /代码> s可以任意大,您可以在它们上使用位运算符,它们很快,代码看起来像C中的位旋转代码(我认为这是一个优势)。
x=0#空

x |=1这会占用20字节还是20位内存?我需要使用大量的这些,它将占用20+1个指针。正确和错误都是单例。谢谢您的输入!我想在这种情况下我必须使用structs模块。你能给我一个创建一个3字节数组并设置一个位的例子吗?我不知道Python中的基本二进制运算符。我只在需要编写一些低级内容时使用过一次。不过,这些文档非常好。@fren请参见演练。顺便说一句,该网站为习惯stdlib提供了一个很好的选择。依赖外部库有什么问题?@ezod:可能是因为这是家庭作业。@S.Lott:是的,这与此相关,但这部分与此无关。如您所见,我本可以用C语言完成这项工作,但我想知道如何使用Python语言的内置功能来完成这项工作。这是一个与其他人相关的普遍问题。@oligofren:在这种情况下,外部图书馆的建议似乎对你同样有用,假设它们是免费的——你可以查看源代码,看看它们是如何(使用内置语言)为你的学术兴趣完成的。好的图书馆。没有使用它,但是从阅读代码中学到了很多。事实证明,在详细的细节中,BitVector的作者使用的是一个(8位)字节数组,就像我在思考的那样。当i7上有数百亿位时,每个操作需要几秒钟。这对于较小的向量非常有效,比如128位。非常简单和内置。我有一个200万位的位向量,它看起来非常慢
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
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.