从循环位集切片子串

时间:2012-04-18 06:01:33

标签: c++ bit-manipulation bitset

我有一个(循环)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次)

1 个答案:

答案 0 :(得分:2)

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

我建议如下:

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 != count;++i){
                dest.set((i + destidx) % D_SZ, source[(i + idx) % S_SZ]);      
        }
}

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