【问题标题】:assigning different regions of bitset c++分配bitset c ++的不同区域
【发布时间】:2013-08-20 16:11:23
【问题描述】:

我有多个位集

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

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

bitset<96> datain;

有没有办法做到以下几点

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

我可以计算出如何分配单个位,但是编写一个循环来分配单个位似乎太过分了。

谢谢。

【问题讨论】:

  • 认为循环是您唯一的选择,至少对于addr 部分而言。
  • 为什么要这么大的位集?每当我想开始使用大于 64 位的 bitset 时,我通常最终会切换到自定义类。

标签: c++ bitset


【解决方案1】:

你可以这样做:

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

这不是特别有效。

【讨论】:

    【解决方案2】:

    我肯定会坚持编写进行逐位分配的循环。将其分解为实用函数(一点也不难写)。这是因为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
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    相关资源
    最近更新 更多