作为数字的位的c++列表

C++ list of bits as numbers

本文关键字:c++ 列表 数字      更新时间:2023-10-16

我希望有一个位的列表,例如,我可以在列表的某个部分进行数学运算。

value: 864
as bits, pos:   0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
as bits, value: 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0,  0

如果我取位1到4和6到9,我得到0,1,1,1,0,1,0,0,0(104)。然后如果我加3,它就变成了0,1,1,0,1,1,1 (107)

我可以用std::vector和位之间按位操作的过程来实现这一点,代码看起来像这样:if(xor(data[n], data[n2])) {data[n - 1] == false;}等等…

我甚至可以使用POD数组,但我在想,c++与计算机内部如此接近,通常没有什么帮助,但在这里,它可以允许这个操作非常快地完成。

类似于将值存储在一个大的POD变量或数组中,然后将它们复制到另一个变量的内存中,以便在将它们复制回存储中的位置之前可以完成数学运算?

更好的是,例如加法运算符是否可以以某种方式将内存中的位置作为参数,直接在数据存储的中间执行加法操作?

听起来你想要Boost。DynamicBitset:

dynamic_bitset类表示一组位。它提供了通过operator[]访问单个位的值,并提供了可以应用于内置整数(如operator&operator<<)的所有位运算符。在运行时,通过给dynamic_bitset的构造函数的形参来指定集合中的位数。

可能的快速方法不起作用,并且将非常有限。

unsigned int n = 8;
unsigned short *p1, *p2;
p1 = reinterpret_cast<unsigned short*>(&n);
p2 = reinterpret_cast<unsigned short*>((&n)+1);
std::cout<<*p1<<", "<<*p2<<std::endl;

这是完整的解决方案,感谢您的信息,让我完成这一点。可以很容易地修改为使用std::vector。

#include <math.h> // for pow in weighted_random_UINT
#include <bitset> // or std::vector<bool>
template <std::size_t T> // this line is not required with std::vector
unsigned int get_chunk(std::bitset<T>* btset, unsigned int start, unsigned int end)
{
    unsigned long out = 0;
    for(unsigned int n = start; n < end; n++)
    {
        out += unsigned long((*btset)[n] * pow(2,double(n-start)));
    }
    return out;
}
void main()
{
    // 6 bits of data in reverse order
    std::bitset<6> data (std::string("000110"));
    // all the data numerically
    std::cout<<get_chunk<6>(&data,0,5)<<std::endl;
    // the first 3 bits as a number
    std::cout<<get_chunk<6>(&data,0,2)<<std::endl;
    // the last 3 bits as a number
    std::cout<<get_chunk<6>(&data,3,5)<<std::endl;
}