3

我有一个(循环的)bitset<N>并且想检索子字符串i...i+K-1(它可能发生的地方i = N - 1; K = 5,所以它必须环绕并获取N-1; 0; 1; 2; 3),作为另一个bitset<K>(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

正如您所见,没有一个 bitset 公共成员函数支持在不同大小的 bitset 之间进行复制。如果您有不适合 ulong 的集合,则转换为 ulong 函数没有用。我不明白为什么标准至少不能有一个支持不同大小的复制构造函数和赋值运算符。也就是说,考虑到标准课程,我看不到一次复制一个位的任何方法。

我建议如下:

模板⟨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 计数,size_t destidx=0)
{
        for(size_t i = 0; i != count;++i){
                dest.set((i + destidx) % D_SZ, 源[(i + idx) % S_SZ]);      
        }
}

至少将移位和复制操作结合起来。您还可以查看 boost 的动态位集,看看它是否更符合您的使用情况。

于 2012-04-23T20:01:09.750 回答