Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.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
是否有一个内置位集';它类似于C++;? 我想在Python中使用一个数组,我可以像C++中的标准位集那样使用。例如: #include<bitset> int main() { std::bitset<100> numBits; } #包括 int main(){ std::位集numBits; }_Python_Bitset - Fatal编程技术网

是否有一个内置位集';它类似于C++;? 我想在Python中使用一个数组,我可以像C++中的标准位集那样使用。例如: #include<bitset> int main() { std::bitset<100> numBits; } #包括 int main(){ std::位集numBits; }

是否有一个内置位集';它类似于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++中发生的可能性不大,

但是,我不知道Python中是否有类似的东西,最好是内置的。

好吧,您可以使用布尔值列表创建一个“位集”:

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>