Tob*_*zel 4 c c++ bit-manipulation undefined-behavior branchless
我正在寻找一种可移植的方法来生成前缀位掩码,该前缀位掩码的第一位n设置为0 <= n <= 32(或 64 或任意整数类型位宽度)。
例子:
prefix_bitmask(0) = 0b00000000000000000000000000000000u
prefix_bitmask(4) = 0b00000000000000000000000000001111u
prefix_bitmask(32) = 0b11111111111111111111111111111111u
Run Code Online (Sandbox Code Playgroud)
n == 0如果我们忽略这些情况或,有两种方法可以实现这一点n == 32:
prefix_bitmask(0) = 0b00000000000000000000000000000000u
prefix_bitmask(4) = 0b00000000000000000000000000001111u
prefix_bitmask(32) = 0b11111111111111111111111111111111u
Run Code Online (Sandbox Code Playgroud)
prefix_mask132 失败和prefix_mask20 失败,两者都是因为大于整数类型的移位是未定义的行为(因为允许 CPU 仅使用移位大小的最低 5 位)。
有没有一种“规范”的方法可以在不分支的情况下解决这个问题?
((uint32_t) 1 << i/2 << i-i/2) - 1。
上述工作uint32_t可以用任何无符号类型替换,并且不需要其他更改。b需要知道类型中的位数和掩码m= 2 b\xe2\x88\x921 的其他选项包括:
((uint32_t) 1 << (i & m)) - 1 - (i >> b)(来自超级猫)
和:
\n((uint32_t) i >> b) ^ 1) << (i & m)) - 1(源自Matt Timmermans的建议)。