3

我有多个位集

bitset<32> addr;
bitset<64> wdata;

我想将它们放入另一个位集中,基本上将它们连接成一个更大的位集。

bitset<96> datain;

有没有办法做以下事情

datain[95 downto 64] = addr;
datain[63 downto 0] = wdata;

我可以弄清楚如何分配单个位,但是编写一个循环来分配单个位似乎过多。

谢谢。

4

2 回答 2

4

你可以这样做:

bitset<96> datain(addr.to_string<>() + wdata.to_string<>());

它不是特别有效。

于 2013-08-20T16:29:34.273 回答
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 (with -std=c++11) 编译时,输出为:

 a: 11111
 b: 1010101010
ab: 111111010101010
于 2013-08-20T16:23:24.383 回答