【问题标题】:branchless bitwise operation无分支按位运算
【发布时间】:2013-02-28 22:20:39
【问题描述】:
我正在寻找可以使用给定掩码确定的无分支按位运算:
掩码:0xFF0000 值:0xAA0000 返回:真
掩码:0xFF0000 值:0xAA00AA 返回:假
掩码:0xFF00FF 值:0xBB00AA 返回:真
掩码:0xFF00FF 值:0x0000AA 返回:假
掩码:0xFF00FF 值:0xAA0000 返回:假
掩码:0xFF00FF 值:0x0A00AA 返回:真
那就是:它必须返回 true 如果:
- 掩码有一个字节设置为 0,该值必须具有与 0 相同的字节。
- 掩码的字节设置为> 0,该值必须具有相同的字节
相差 0。
编辑:
0xFFFF00 和 0x00AA00 不应该匹配。
如果掩码的字节> 0,则该值必须具有相同的字节> 0。
即:如果掩码有这种模式[XX][00][XX],则值必须相同。其中XX的值可以是从01到FF。
谢谢!
【问题讨论】:
标签:
bit-manipulation
bitwise-operators
bitmask
【解决方案1】:
根据问题,我假设我们只处理低位三个字节。
一个简单的解决方案(17 个操作):
((mask & 0x0000FF) == 0) == ((value & 0x0000FF) == 0) &&
((mask & 0x00FF00) == 0) == ((value & 0x00FF00) == 0) &&
((mask & 0xFF0000) == 0) == ((value & 0xFF0000) == 0)
更好的解决方案(9 个操作):
(((mask & 0x7F7F7F) + 0x7F7F7F | mask) & 0x808080) ==
(((value & 0x7F7F7F) + 0x7F7F7F | value) & 0x808080)
第三种解决方案(9 个操作):
!((((mask & 0x7F7F7F) + 0x7F7F7F | mask) ^
((value & 0x7F7F7F) + 0x7F7F7F | value)) & 0x808080)
如果您的代码准备将零作为通过,将非零作为失败,则通过删除围绕整个表达式的!,可以将第三种解决方案减少到 8 个操作。