3

私は(循環)を持っていて、別の部分文字列(Kはもちろんコンパイル時に知られています)として、部分文字列(それが発生する可能性があるため、ラップアラウンドして取得する必要があります)bitset<N>を取得したいと思いますi...i+K-1i = N - 1; K = 5N-1; 0; 1; 2; 3bitset<K>

operator &異なるサイズのオペランドを許可しないため、明らかなことは機能しません(それは些細なことですが?)

bitset<N> data = ...;
bitset<K> mask; mask = ~mask;
bitset<K> rotated = in << i | in >> (K - i);
bitset<K> slice = rotated & mask;

次善の策は大規模では機能しませんN

bitset<K> slice( rotated.to_ullong() & mask.to_ullong() );

実装する以外に何をすべきbitset<min<N,K>::value> operator &(bitset<N>,bitset<K>)か?(そしておそらくそれほど非効率的ではないかもしれませんが、このアプローチはセットを3回コピーします)

4

1 に答える 1

2

これまで見てきたように、ビットセットのパブリック メンバー関数は、異なるサイズのビットセット間のコピーをサポートしていません。ulong に収まらないセットがある場合、convert to ulong 関数は役に立ちません。標準が、少なくとも異なるサイズをサポートするコピー コンストラクターと代入演算子を持つことができなかった理由がわかりません。つまり、標準クラスを考えると、ビットを1つずつコピーする方法はわかりません。

次のようなものをお勧めします。

template⟨size_t D_SZ,size_t S_SZ⟩
void CopyBitset(std::bitset⟨D_SZ⟩ &dest, const std::bitset⟨S_SZ⟩ &source,size_t idx,
    size_t count,size_t destidx=0)
{
        for(size_t i = 0; i != カウント;++i){
                dest.set((i + destidx) % D_SZ, source[(i + idx) % S_SZ]);      
        }
}

少なくとも、シフト操作とコピー操作が組み合わされます。また、boost の動的ビットセットを調べて、使用法により近いかどうかを確認することもできます。

于 2012-04-23T20:01:09.750 に答える