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