私は間違いなく、ビットごとの割り当てを行うループを書くことに固執します。ユーティリティ関数として分解します(書くのはまったく難しくありません)。これは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