1

我写了一个函数,它应该从unsigned int延迟的位集合中提取。我想为此使用掩码。我不确定定义此类掩码的最佳方法是什么。例如,我需要提取位 6:14。所以我需要将掩码定义为 111111111 << 6. 我的问题是我不能使用 boost 或类似的东西,标准 c/c++ 不知道使用二进制数。可以做的是使用 111111111 作为 2^10-1。我不确定 - 这是最好的(最优雅的)解决方案。有什么建议吗?

4

4 回答 4

3

大多数人在表示掩码时使用十六进制,例如0xFF、0x0A等。

于 2013-01-09T14:34:04.607 回答
2

让我们先尝试制作一堆。

二进制 N 个 1 的序列的一个特性是,就像十进制的 9 序列一样,如果向其中添加 1,则会得到一个 1 后跟 N 个 0。我们可以使用相反的情况,如果你从一个 1 中减去一个,然后是 N 个零,那么你会得到一个由 N 个 1 组成的序列,来实现这一点。

一个后跟 N 个零的 1 只是右移 N 个位置。

template <typename Uint>
Uint zigamorph(int n) { // http://catb.org/jargon/html/Z/zigamorph.html
    return 1 << n - 1; // same as 2^n - 1 :)
}

有了任何长度的 zigamorphs,您现在可以通过使用按位与轻松地从任何值中获取所需的位。

template <typename Uint>
Uint mask_bits(Uint value, int first_bit, int last_bit) { // both inclusive?
    return value & zigamorph<Uint>(last_bit-first_bit+1);
}
于 2013-01-09T14:42:23.313 回答
1

您可以访问标准库吗?如果是这样,我会尝试std::bitset

是它的文档。

于 2013-01-09T14:37:32.143 回答
1

只需使用0x1FF << 6(如果需要111111111 << 6)或0x3FF << 6(如果需要 2^10-1 << 6)。这比你的二进制文件要清楚得多。正如 Jerry Coffin 指出的那样,您可以使用 2^10 轻松获得 2^10 1 << 10,但我不相信这比仅使用十六进制更清晰。(就此而言,在某些情况下,0x7FC00可能非常清楚。它的优点是您可以直观地看到单词中位的确切位置,并且如果您有十六进制转储,则更容易将它们挑选出来。)

于 2013-01-09T15:13:35.600 回答