我想在给定的常量数据数组上封装或强制转换std:bitset或者用不同的方式表示,用外部数据初始化位集。
用户知道比特的索引,然后他可以通过bitset.test(i)
来检查该索引。数据很大,所以必须高效。(机器比特顺序无关紧要,我们可以用正确的方式存储它(。这就是我尝试的:
constexpr uint32_t data[32] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32};
constexpr std::bitset<1000> bset(1); //bit bitset initialized with a value here
constexpr std::bitset<1000> bset2(data); //init it with our data, this is not working
由数据保持的位数为32*32=1024。使用我的比特集,我可以处理几乎所有的范围。用户不需要超过1000。有人能向我解释一下,在我上面用bset2的例子中,cpp是如何做到这一点的吗?
不幸的是,std::bitset
没有适合您需要的设计。
它没有被设计成聚合(就像std::array
一样(,因此聚合初始化是不可能的(而且用std::memcpy
将比特复制到其中也是未定义的行为(。
在constexpr
构造函数中只能使用一个unsigned long long
。
operator []
和set
方法将在C++23中变为constexpr
,因此之后会有一种方法。
只需使用constexpr
原始数组或std::array
,然后添加位访问方法即可。