我有多个位集
bitset<32> addr;
bitset<64> wdata;
我希望将它们放入另一个bitset,基本上将它们连接成一个更大的bitset。
bitset<96> datain;
在某种程度上做了以下
datain[95 downto 64] = addr;
datain[63 downto 0] = wdata;
我可以弄清楚如何分配单个位,但写一个循环来分配单个位似乎过多。
感谢。
答案 0 :(得分:4)
你可以这样做:
bitset<96> datain(addr.to_string<>() + wdata.to_string<>());
效率不高。
答案 1 :(得分:3)
我明确地坚持写循环,这使得逐位分配。将其视为效用函数(完全不难写)。这是因为std::bitset
不符合Container
概念,因此无法使用标准算法(例如std :: copy)进行切片或复制。
另外,请注意,由于实现,您不能简单地获取特定位的地址(不是这样的,尽管您可以获得“代理参考”)。
只需编写它(您的自定义“位切片器”)并永远忘记。
只是一个样子的样子(它很难看,但它有效):
#include<bitset>
#include<iostream>
template<size_t N1, size_t N2>
std::bitset<N1+N2> bitwise_copy(const std::bitset<N1>& b1, const std::bitset<N2>& b2) {
std::bitset<N1+N2> res;
for(size_t k=0; k<N2; k++) {
res[k] = b2[k];
}
for(size_t k=0; k<N1; k++) {
res[N2+k] = b1[k];
}
return std::move(res);
}
int main() {
std::bitset<5> a("11111");
std::bitset<10> b("1010101010");
auto ab = bitwise_copy(a, b);
std::cout<<" a: "<<a<<std::endl
<<" b: "<<b<<std::endl
<<"ab: "<<ab<<std::endl;
return 0;
}
使用gcc 4.8.1(带-std=c++11
)进行编译时,输出为:
a: 11111
b: 1010101010
ab: 111111010101010