作为数字的C ++位列表

时间:2011-09-20 17:13:50

标签: c++ arrays math collections integer

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

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,0,1,0,0,0(104)。然后,如果我加3,它变为0,1,1,0,1,0,1,1(107)。

我可以使用std :: vector和一个涉及位之间按位操作的过程来执行此操作,代码看起来像这样的东西if(xor(data [n],data [n2])){data [n - 1] == false;}等......

我甚至可以使用POD阵列,但我在想,C ++与计算机的内部结构如此接近往往没有帮助,但就在这里,它可以让这项操作非常快速地完成。

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

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

2 个答案:

答案 0 :(得分:1)

听起来你想要BoostDynamicBitset

  

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

答案 1 :(得分:1)

可能的快捷方式不起作用,并且会受到限制。

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;
}