在C中进行谓词赋值的更好方法是什么?

cle*_*ong 2 c

我要做的是避免以下情况:

if(*ptr > 128) {
   number = 5;
}
Run Code Online (Sandbox Code Playgroud)

当没有关于分支将走哪条路的明确模式时,这样的代码表现不佳.我想出的是:

int arr[] = { number, 5 };
int cond = *ptr > 128;
number = arr[cond];
Run Code Online (Sandbox Code Playgroud)

根据我的测试,当输入是随机的时,它的运行速度是条件的两倍.我想知道的是,是否有更聪明的方法来做到这一点,也许使用按位运算符.

nne*_*neo 5

一个聪明的编译器肯定应该使用正确的优化设置将其编译为条件移动; 检查拆卸是否确定.

有这种无分支的解决方案:

int mask = -(*ptr > 128);
number = (number & mask) | (5 & ~mask);
Run Code Online (Sandbox Code Playgroud)

最后一行也可以

number = ((mask & (number ^ 5)) ^ 5);
Run Code Online (Sandbox Code Playgroud)

如果你想减少使用一次操作.但是,请注意,编译器将无法优化其中任何一个.您最好将此特定优化留给编译器担心,除非您特别知道编译器无法进行优化(在这种情况下,您可能需要检查编译器版本或标志).