没有任何内置的东西。如果您需要这样的数据结构来获得正确的字节输出,并设置正确的位,例如对于网络协议、二进制文件结构或硬件控制,将 True 和 False 值列表排序为字节很容易实现。
还可以创建一个类以允许在字节数组对象中直接对内存中的位进行多次计算。但是,不太可能发生在 C++ 中,您不会获得速度或内存(好的,对于大型位集,您可以获得内存)优势 - Python 将处理每个位作为对 True 或 False 对象的完整引用(或完整的 0 和 1 整数),无论您在代码中做什么。
也就是说,如果你有一个包含 True 和 False 值的列表,你想以位序列的形式输出到文件,例如,这样的代码可能会起作用:
a = [True, True, False, False, False, True, ...]
with open("myfile.bin", "wb" as file):
for i, value in enumerate(a):
if not i % 8:
if i:
file.write(byte)
byte = 0
byte <<= 1
byte |= value
if i % 8:
byte <<= (8 - i % 8)
file.write(byte)
一种更复杂的方法是为其创建全类支持,方法是将值保存在 bytearray 对象中,并在设置和重置操作时计算每个位索引 - 一种极简的方法是:
class BitArray(object):
def __init__(self, lenght):
self.values = bytearray(b"\x00" * (lenght // 8 + (1 if lenght % 8 else 0)))
self.lenght = lenght
def __setitem__(self, index, value):
value = int(bool(value)) << (7 - index % 8)
mask = 0xff ^ (7 - index % 8)
self.values[index // 8] &= mask
self.values[index // 8] |= value
def __getitem__(self, index):
mask = 1 << (7 - index % 8)
return bool(self.values[index // 8] & mask)
def __len__(self):
return self.lenght
def __repr__(self):
return "<{}>".format(", ".join("{:d}".format(value) for value in self))
如您所见,这样做并没有提高速度,而且您需要大量位才能从中节省内存。这是在交互式提示中使用的上述类的示例:
In [50]: a = BitArray(16)
In [51]: a[0] = 1
In [52]: a[15] = 1
In [53]: a
Out[53]: <1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>