无分支按位运算

时间:2013-02-28 22:20:39

标签: bit-manipulation bitwise-operators bitmask

我正在寻找可以使用给定掩码确定的无分支按位运算:

  

掩码:0xFF0000值:0xAA0000返回:true

     

掩码:0xFF0000值:0xAA00AA返回:false

     

掩码:0xFF00FF值:0xBB00AA返回:true

     

掩码:0xFF00FF值:0x0000AA返回:false

     

掩码:0xFF00FF值:0xAA0000返回:false

     

掩码:0xFF00FF值:0x0A00AA返回:true

那就是:如果出现以下情况,它必须返回true:

  • 掩码的字节设置为0,该值必须与0相同。
  • 掩码的字节设置为> 0,该值必须具有相同的字节 不同的0。

编辑:

0xFFFF00和0x00AA00不匹配。 如果掩码具有字节> 0,该值必须具有相同的字节> 0

那是:如果面具具有此模式[XX] [00] [XX],则该值必须相同。其中XX可以是从01到FF的值。

谢谢!

1 个答案:

答案 0 :(得分: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个操作。