0

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

掩码: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 的值。

谢谢!

4

1 回答 1

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

于 2013-04-04T04:39:33.157 回答