最好的方法是定义一个掩码

the best way define a mask

本文关键字:一个 掩码 定义 方法      更新时间:2023-10-16

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

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

让我们先试着做一堆1。

N个1的二进制序列的一个性质是,就像一个9的十进制序列一样,如果你给它加1,你会得到一个1后面跟着N个0。我们可以用逆运算,如果你用一个1减去1,后面跟着N个0,就得到一个N个1的序列,来做这个。

1后面跟着N个0只是右移了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);
}

只要用0x1FF << 6(如果你想要111111111 << 6)或0x3FF << 6(如果你想要2^10-1 <<这就清楚多了而不是二进制。正如杰里·科芬所指出的,你可以很容易地做到通过使用1 << 10得到2^10,但我不相信这是比只用十六进制更清楚。(就此而言,在某些情况下,0x7FC00可能非常清楚。它有好处是你可以直观地看到比特的位置在这个世界上,如果你有一个魔咒,就更容易把它们挑出来转储)。

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

这是它的文档。