我编写了一个函数,它应该从unsigned int
个不同的位集中提取。
我想使用一个面具。我不确定定义这种面具的最佳方法是什么。
例如,我需要提取位6:14。因此我需要将掩码定义为111111111 << 6
。
我的问题是我不能使用boost或类似的东西,标准的c / c ++不知道使用二进制数。
可以做的是使用111111111作为2 ^ 10-1。我不确定 - 这是最好的(最优雅的)解决方案。任何建议?
答案 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
可能非常清楚。它有
你可以直观地看到这些位的优势
在单词中,如果你有一个十六进制,它更容易被挑选出来
转储。)