有没有办法从位集中有效地提取比特的CPU字长长子序列,而无需单独迭代每个位?像
这样的东西#include <bitset>
#include <iostream>
using namespace std;
int main() {
bitset<100> b;
// Do something with b
// ...
// Now i want sizeof(long) many bits starting at position 50
unsigned long l = (b>>50).to_ulong();
}
如果它会截断bitstring而不是抛出异常,那么会这样做!
答案 0 :(得分:4)
您可以创建一个仅设置了底部N位的常量位集mask
,例如:
bitset<100> const mask((unsigned long) -1);
然后你可以((b >> 50) & mask).to_ulong()
来提取比特。如果“word”的定义与unsigned long不同,则需要使用不同的掩码。
(我将左移改为右移,相信会更好。)
一个足够聪明的编译器可以将它转换为一个移位并读出结果;我怀疑是否有任何编译器实际上足够聪明。但我怀疑转变的成本超过了成本。无论如何。
答案 1 :(得分:0)
有关评论的新信息使这个答案无关紧要。
答案需要一个问题:你的bitset是由什么基本数据类型组成的? 假设在无符号字符的lsB到msB数组上将所述bitset存储为lsb到msb,则:
1)字节索引保持位X由X / 8;
找到2)字节(X / 8)处的位索引由X%8找到;
在X%8 -1左移该无符号字符后,你得到了无符号长整数和下一个8-X%8位的lsb。因为移位运算符在单个无符号字符上运行,所以你需要进一步的代码复制到下一个3(或4个)无符号字符)到辅助短/长,然后或者复制到结果中的相关位完整的无符号长。