3

複数のビットセットがあります

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

そして、それらを別のビットセットに入れ、本質的にそれらをより大きなビットセットに連結したいと考えています。

bitset<96> datain;

次のことをする方法はありますか

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

単一ビットを割り当てる方法を考え出すことはできますが、単一ビットを割り当てるループを書くのはやり過ぎのようです。

ありがとう。

4

2 に答える 2

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
于 2013-08-20T16:23:24.383 に答える