如果没有设置位,则无分支方式设置所有位?

问题描述 投票:0回答:1

我正在寻找以下内容的无分支实现:

int f(int c) {
  if (c == 0) {
    return 0xffffffff; // all bits set
  } else {
    return c;
  }
}

我还没有找到任何聪明的方法来做到这一点。有什么技巧吗?

c bit-manipulation branchless
1个回答
1
投票

正如 Nick ODell 所提到的,编译器很可能已经将此代码编译为没有分支的指令。使这种情况更有可能发生的公式是

x - (x == 0)
x - !!x
,编译器通常能够通过使用 CPU 特定功能在没有分支的情况下实现。您甚至可以尝试用纯粹基于位操作的公式来替换它。例如。仅当
((x - 1) & ~x) >> 31
时,
x
1
无符号)才是
x == 0
,否则为
0
。所以

x - (((x - 1) & ~x) >> 31)

将是

f
的完全无分支实现。在实践中,我预计它会比编译器为其他公式生成的任何内容慢。

© www.soinside.com 2019 - 2024. All rights reserved.