从任意bitset子序列中提取long

时间:2011-06-04 14:14:31

标签: c++ bitset

有没有办法从位集中有效地提取比特的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而不是抛出异常,那么

会这样做!

2 个答案:

答案 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个)无符号字符)到辅助短/长,然后或者复制到结果中的相关位完整的无符号长。