位操作-无分支位操作



我正在寻找一个无分支的按位操作,可以确定给定的掩码:

掩码: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个操作。

最新更新