一些位操作任务需要所有偶数位的掩码。每次这样的掩码都由一个 0x55555555 形式的常量给出,如果它unsigned
需要 32 位就很好。如果是 16 或 64?
如何以适用于类型中任意数量位的方式为所有偶数位定义掩码?该定义必须是编译时常量。
一些位操作任务需要所有偶数位的掩码。每次这样的掩码都由一个 0x55555555 形式的常量给出,如果它unsigned
需要 32 位就很好。如果是 16 或 64?
如何以适用于类型中任意数量位的方式为所有偶数位定义掩码?该定义必须是编译时常量。
它可以很简单
(unsigned int)-1 / 3
。让我们使用现实生活中的东西
如果没有,您可以使用 gbg 的答案 :)
仍然是 O(log N):),其中 N 是类型的大小。
在编译时像 gbg 一样计算 - https://gcc.godbolt.org/z/78EaTqzKK
使用
constexpr
-功能:结论:
ideone 上的代码
掩码可以表示为总和4 0 + 4 1 + ... + 4 k。根据几何级数和的公式,这个和等于(4 k+1 - 1) / 3。
如果无符号类型的位数为偶数,则其最大值为2 2k - 1。等于4k - 1。如果将此数字除以三,您将得到所需的掩码。例如,对于
unsigned
计算UINT_MAX / 3
。该程序
C
不会以可移植的方式构建掩码。类型的最大值是作为-1
无符号类型的转换获得的。需要再进行一次转换,以便更短的类型的值unsigned
同样短。否则,将unsigned
使用掩码值unsigned short
或获取类型unsigned char
:相同的
C++
:但是,如果您的计算机具有奇数位数的类型怎么办?例如,一个五字节的整数,一个字节有九位。必须采取更多步骤:
DRAFT_MASK
- 一个老式的面具。如果位数是奇数,则(2 2k+1 - 1) / 3 = (2 4 k - 1) / 3 = (2(4 k - 1) + 1) / 3 = 2((4 k - 1) / 3) + 1 / 3 .
左边的项是双重掩码。右项四舍五入为零——整数除法。结果是一个突出显示奇数位的掩码。
如果类型中的位数为奇数,则构造
ODD_BITS(type)
等于 1 - 检查掩码的最低有效位。在这种情况下,旧掩码必须向左移动一位并添加最低有效位。这就是它的作用MASK
。如果位数为偶数,则结果MASK
与 相同DRAFT_MASK
。当我得到合适的硬件时,我一定会测试它。
在 C 中,双重编译有助于创建常量。中的示例
gcc
:我们使用类型大小的模板编写:
我们得到一个标题:
mask.h
具有 2 的幂的值,这可以在没有循环的情况下计算:
在线编译器