gpt4 book ai didi

c++ - 从循环位集中切出一个子串

转载 作者:太空狗 更新时间:2023-10-29 21:48:41 24 4
gpt4 key购买 nike

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

最佳答案

如您所见,所有 bitset 公共(public)成员函数都不支持在不同大小的 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 的动态位集,看看它是否更符合您的使用情况。

关于c++ - 从循环位集中切出一个子串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10203655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com