我正在寻找以下内容的无分支实现:
int f(int c) {
if (c == 0) {
return 0xffffffff; // all bits set
} else {
return c;
}
}
我还没有找到任何聪明的方法来做到这一点。有什么技巧吗?
正如 Nick ODell 所提到的,编译器很可能已经将此代码编译为没有分支的指令。使这种情况更有可能发生的公式是
x - (x == 0)
或 x - !!x
,编译器通常能够通过使用 CPU 特定功能在没有分支的情况下实现。您甚至可以尝试用纯粹基于位操作的公式来替换它。例如。仅当 ((x - 1) & ~x) >> 31
时,x
(1
无符号)才是 x == 0
,否则为 0
。所以
x - (((x - 1) & ~x) >> 31)
将是
f
的完全无分支实现。在实践中,我预计它会比编译器为其他公式生成的任何内容慢。