定义面具的最佳方式

时间:2013-01-09 14:32:01

标签: c++ binary mask

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

让我们先尝试制作一堆。

二进制中N个序列的一个属性就是,就像十进制的九个序列一样,如果你向它添加一个,你得到一个后跟一个N零。我们可以使用逆,事实上,如果你从一个减去一个后跟N个零,得到你的N个序列,就可以做到这一点。

一个跟随N零的一个只是右移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 :)
}

使用任意长度的zigamorph,您现在可以通过使用按位和方便地从任何值获得所需的位。

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);
}

答案 2 :(得分:1)

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

Here是它的文档。

答案 3 :(得分:1)

只需使用0x1FF << 6(如果您需要111111111 << 6)或0x3FF << 6(如果您想要2 ^ 10-1&lt;&lt; 6)。这是相当清楚的 比你的二进制文件正如Jerry Coffin指出的那样,你很容易 使用1 << 10得到2 ^ 10,但我不相信这是 比仅使用十六进制更清晰。 (对于这个问题, 在某些情况下,0x7FC00可能非常清楚。它有 你可以直观地看到这些位的优势 在单词中,如果你有一个十六进制,它更容易被挑选出来 转储。)