我正在寻找一个无分支的按位操作,可以确定给定的掩码:
掩码:0xFF0000值:0xAA0000返回:true
掩码:0xFF0000值:0xAA00AA返回:false
掩码:0xFF00FF值:0xBB00AA返回:true
掩码:0xFF00FF值:0x0000AA返回:false
掩码:0xFF00FF值:0xAA0000返回:false
掩码:0xFF00FF值:0x0A00AA返回:true
也就是:它必须返回true,如果:
- 掩码有一个字节设置为0,该值必须有相同的字节为0。
- 掩码有一个字节设置为> 0,则该值必须具有相同的字节
0xFFFF00和0x00AA00不匹配。如果掩码中有一个字节> 0,则该值必须有相同的字节> 0。
也就是说:如果掩码有这种模式[XX][00][XX],则值必须相同。其中XX取值范围为01 ~ FF。
谢谢!
我假设我们只处理低阶的三个字节,根据问题。
一个简单的解决方案(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个操作。