是否有类似于C++的std::bitset的内置位集? - python

我想在Python中使用可以像C ++中的标准位集那样使用的位数组。例:

#include<bitset>
int main() {
    std::bitset<100> numBits;
}

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

参考方案

这没有内置的功能。如果您需要这样的数据结构以便具有正确的字节输出(设置了正确的位),例如用于网络协议,二进制文件结构或硬件控制,则将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>

在Python和C++之间传输数据而无需写入Windows和Unix文件 - python

我有预先存在的python和C ++文件,其中python文件定义了许多点,而C ++代码利用其现有库进行了所需的计算。最终产品是C ++代码写入的文件。我正在寻找一种在python中获取2000点列表的方法,将其传递给函数,然后执行所有C ++代码并输出我需要的文件。其他注意事项。这必须是可以在Linux或Windows机器上工作的东西,并且最少安装新插件…

如何锁定终端运行的perl,obj c,c++,python和ruby等脚本的源代码? - python

我想出售我在perl,obj c,c ++,python,ruby,bash,php等中制作的脚本等它们都在终端中运行。 (Linux)如何锁定源代码,以便无需人们访问源代码即可分发我的脚本..?换句话说,如何将在Terminal中运行的程序的源代码锁定,以便人们可以使用该程序(如果该代码已下载到他们的Linux机器上,但他们无法访问实际的源代码)?例:ex…

在Java中,执行“ ++++++++”表达式,编译器未报告任何错误并且可以正确执行? - java

我用eclipse编写了这段代码,用war写过,结果为3d。public static void main(String[] args) { double a = 5d + + + + + +-+3d; System.out.println(a); } 参考方案 您的表情可以改写为(5d) + (+ + + + +-+3d) 其中第一个+是应用于两个操作数的…

Python + Selenium:我无法从div获取打印文本 - python

Python + Selenium:我无法从此div获取打印文本:<div id="modal-content-18" class="modal-content" data-role="content"> <div> SignUp Failed. Please Try Aga…

Python MySQLdb“错误:已安装Microsoft Visual C++ 14.0” - python

我正在尝试连接到MySql数据库并将其数据用于一些代码,尽管我正在使用pip install mysqlclient 它给我一个错误说明:  “错误:需要Microsoft Visual C ++ 14.0。  Visual C ++生成工具”:  http://landinghub.visualstudio.com/visual-cpp-build-too…