我正在寻找以下的无分支实现:
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
unsigned)仅当x == 0
时为1
,否则为0
。所以
x - (((x - 1) & ~x) >> 31)
将是f
的完全无分支的实现。在实践中,我希望它比编译器为其他公式生成的任何公式都要慢。