1

有没有一种方法可以有效地从位集中提取 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();
}

如果它会截断位串而不是抛出异常,就会这样做!

4

2 回答 2

4

您可以创建一个仅设置了底部 N 位的常量mask位集,例如:

bitset<100> const mask((unsigned long) -1);

然后你可以((b >> 50) & mask).to_ulong()提取这些位。如果您对“单词”的定义与 unsigned long 不同,则需要使用不同的掩码。

(我将您的左移更改为右移,我相信这会更好。)

一个足够聪明的编译器可以将其转换为仅转换并读出结果;我怀疑是否有任何编译器实际上足够聪明。但我怀疑这种转变的成本无论如何都要超过 and 的成本。

于 2011-06-04T15:46:46.780 回答
0

关于评论的新信息使这个答案变得无关紧要。

答案需要一个问题:您的 bitset 是由什么基本数据类型构成的?假设所述位集存储在一个 lsB 到 msB 无符号字符数组上的 lsb 到 msb 上,则:

1) 字节索引保存位 X 由 X/8 找到;

2)字节(X/8)处的位索引,由X%8找到;

在该 unsigned char 左移 X%8 -1 之后,您将获得结果 unsigned long 的 lsb 和接下来的 8-X%8 位。因为移位运算符对单个无符号字符进行操作,所以您需要进一步的代码将下一个 3(或 4)无符号字符)复制到辅助短/长字符中,然后将相关位复制到结果中完整的无符号长。

于 2011-06-04T14:26:54.700 回答