我正在寻找一种可移植的方法来生成前缀位掩码,其中第一个 n
位设置为0 <= n <= 32
(或64或任意整数类型的位宽度)。
例如:
prefix_bitmask(0) = 0b00000000000000000000000000000000u
prefix_bitmask(4) = 0b00000000000000000000000000001111u
prefix_bitmask(32) = 0b11111111111111111111111111111111u
如果我们忽略
n == 0
或 n == 32
的情况,这已经有两种方法可以工作:// "constructive": set only the required bits
uint32_t prefix_mask1(int i) { return (uint32_t(1) << i) - 1; }
// "destructive": shift unneeded bits out
uint32_t prefix_mask2(int i) { return ~uint32_t(0) >> (32 - i); }
prefix_mask1
在32时会失败,prefix_mask2
在0时会失败,均因为大于整型的位移是未定义行为(因为CPU仅允许使用位移大小的最低5位)。
是否有一种不需要分支的“规范”解决方法?
((unit32_t)(-1)) >> (32-i)
- Weather Vane32
不比整数类型大。这是因为你的5位规则吗?是的,我明白了,32位移不起作用。它具有与>> 0
相同的效果,但可能未定义。 - Weather Vane