Python是否有位域types?

我需要一个布尔数组的紧凑表示,Python有一个内置的位域types,还是我需要find一个替代解决scheme?

当我最近有类似的需求时, Bitarray是我发现的最好的答案。 这是一个C扩展(比BitVector,这是纯粹的Python快得多),并将其数据存储在一个实际的位域(所以它是一个numpy布尔数组的8倍以上的内存效率,似乎每个元素使用一个字节。

如果您主要希望能够命名您的位字段并轻松地操作它们,例如在通信协议中使用表示为单个位的标志,那么您可以使用ctypes的标准结构和联合function,如“我如何”在Python中正确声明ctype结构+联合? – 堆栈溢出

例如,要单独使用一个字节的4个最低有效位,只需在LittleEndianStructure中将其从最小到最重要的名称命名即可。 您使用联合来提供对字节或整数的相同数据的访问,以便您可以将数据移入或移出通信协议。 在这种情况下,通过flags.asbyte字段完成:

 import ctypes c_uint8 = ctypes.c_uint8 class Flags_bits(ctypes.LittleEndianStructure): _fields_ = [ ("logout", c_uint8, 1), ("userswitch", c_uint8, 1), ("suspend", c_uint8, 1), ("idle", c_uint8, 1), ] class Flags(ctypes.Union): _fields_ = [("b", Flags_bits), ("asbyte", c_uint8)] flags = Flags() flags.asbyte = 0xc print(flags.b.idle) print(flags.b.suspend) print(flags.b.userswitch) print(flags.b.logout) 

四位(我在这里打印的最重要的,打印时显得更自然)是1,1,0,0,即二进制的0xc。

你应该看看最近版本2.0的bitstring模块。 二进制数据紧凑地存储为字节数组,可以很容易地创build,修改和分析。

您可以从二进制,八进制,hex,整数(大或小端),string,字节,浮点数,文件等等创buildBitString对象。

 a = BitString('0xed44') b = BitString('0b11010010') c = BitString(int=100, length=14) d = BitString('uintle:16=55, 0b110, 0o34') e = BitString(bytes='hello') f = pack('<2H, bin:3', 5, 17, '001') 

然后,您可以使用简单的函数或切片符号来分析和修改它们 – 无需担心位掩码等。

 a.prepend('0b110') if '0b11' in b: c.reverse() g = a.join([b, d, e]) g.replace('0b101', '0x3400ee1') if g[14]: del g[14:17] else: g[55:58] = 'uint:11=33, int:9=-1' 

还有一个位的概念,所以你可以把它看作是一个文件或stream,如果这对你有用。 属性用于给出位数据的不同解释。

 w = g.read(10).uint x, y, z = g.readlist('int:4, int:4, hex:32') if g.peek(8) == '0x00': g.pos += 10 

此外还支持标准的按位二进制运算符,打包,解包,字节sorting等等。 最新版本是针对Python 2.6到3.1,虽然它是纯Python,但在内存和速度方面都进行了相当的优化。

用两个幂来表示你的每个值:

 testA = 2**0 testB = 2**1 testC = 2**3 

然后设置一个值为true:

 table = table | testB 

要设置一个值为false:

 table = table & (~testC) 

要testing一个值:

 bitfield_length = 0xff if ((table & testB & bitfield_length) != 0): print "Field B set" 

如果这对你没有意义,可以深入了解hex表示。 这基本上是如何跟踪embedded式C应用程序中的布尔标志(如果你有限制的内存)。

BitVector包可能是你需要的。 它不是内置到我的python安装,但很容易追踪在python网站。

https://pypi.python.org/pypi/BitVector为当前版本。;

NumPy有一个数组接口模块,可以用来创build一个位域。

我使用二进制按位运算符!,&,|,^,>>和<<。 它们工作得非常好,直接在底层C中直接实现,底层C通常直接在底层硬件上。

如果你的位域很短,你可以使用struct模块 。 否则,我会推荐一些arrays模块的包装。

另外,ctypes模块确实包含位字段 ,但是我从来没有使用过它。 注意力不足

如果要使用整数(或长整数)来表示布尔数组(或整数集),请查看http://sourceforge.net/projects/pybitop/files/

它提供了插入/提取位域到长整数; find最重要的或最不重要的'1'位; 统计所有的1; 位反向; 像这样的东西,这是纯粹的Python,但在C中快得多