【问题标题】: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。

谢谢!

【问题讨论】:

  • @leppie 我编辑了我的问题。

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

【讨论】:

    猜你喜欢
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    相关资源
    最近更新 更多