是否有一个内置位集';它类似于C++;? 我想在Python中使用一个数组,我可以像C++中的标准位集那样使用。例如: #include<bitset> int main() { std::bitset<100> numBits; } #包括 int main(){ std::位集numBits; }
但是,我不知道Python中是否有类似的东西,最好是内置的。好吧,您可以使用布尔值列表创建一个“位集”:是否有一个内置位集';它类似于C++;? 我想在Python中使用一个数组,我可以像C++中的标准位集那样使用。例如: #include<bitset> int main() { std::bitset<100> numBits; } #包括 int main(){ std::位集numBits; },python,bitset,Python,Bitset,但是,我不知道Python中是否有类似的东西,最好是内置的。好吧,您可以使用布尔值列表创建一个“位集”: mybitset = [True, False, False, True, False] 我缺乏上下文来给你一个更恰当的回答。这并不是天生的。如果您需要这样的数据结构以获得正确的字节输出,并设置正确的位,例如对于网络协议、二进制文件结构或硬件控制,将真值和假值列表排序为字节序列是很容易实现的 还可以创建一个类来允许直接计算bytearray对象中的内存位。然而,在C++中发生的可能性不大,
mybitset = [True, False, False, True, False]
我缺乏上下文来给你一个更恰当的回答。这并不是天生的。如果您需要这样的数据结构以获得正确的字节输出,并设置正确的位,例如对于网络协议、二进制文件结构或硬件控制,将真值和假值列表排序为字节序列是很容易实现的 还可以创建一个类来允许直接计算bytearray对象中的内存位。然而,在C++中发生的可能性不大,你不会获得速度或内存(OK,对于大比特集,你可以获得内存)的优势。Python将处理每个比特作为对真或假对象(或完全0和1整数)的完整引用,而不管代码中的代码是什么。 也就是说,如果您有一个包含真值和假值的列表,您希望以位序列的形式输出到(比如)文件,那么这样的代码可能会起作用:
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)
a=[True,True,False,False,False,True,…]
打开时(“myfile.bin”、“wb”作为文件):
对于i,枚举(a)中的值:
如果不是我%8:
如果我:
文件写入(字节)
字节=0
字节您可以使用普通的列表
;然而,这并不是非常有效的内存:在32位Python构建中,每“位”将浪费4个字节,而在64位构建中则浪费8个字节。这是因为列表的元素实际上是(对)其他Python对象的引用
Python标准库也有内置模块,它在存储同质值方面比通用的列表
更有效,但遗憾的是,它不支持位作为数据类型。此外,它不提供Set
接口
因此,如果考虑内存效率,那么您的选择可以归结为在数组上构建自己的Python位集实现,或者从中安装第三方模块,例如,通常,您只需要内置int
类(或者python2中的long
)。如果您特别关心隐藏班次,可以将其封装在类中。我猜您没有这样做?@erip,这意味着python没有提供关于此的内置UTIL?@LightnessRacesinOrbit,抱歉,问题已更新,请帮助。抱歉将问题更改得太多。@jweyrich,感谢您的编辑。这可能取决于使用的python解释器。sys.getsizeof(mybitset)
在我的机器上返回104。可以将其视为指向单例的指针,因为每个True和False的id
都是相同的:>[id(x)for x in mybitset][139974218568224、139974218568256、139974218568256、139974218568224、139974218568256]
。
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>