0

我正在阅读这个问题为什么处理排序数组比处理未排序数组更快?以及 Mysticial 提供的最佳答案。答案很好地解释了正在发生的事情以及原因,并且还说:

那么可以做些什么呢?

如果编译器无法将分支优化为条件移动,如果您愿意牺牲可读性来换取性能,您可以尝试一些技巧。

代替:

 if (data[c] >= 128)
     sum += data[c];

和:

int t = (data[c] - 128) >> 31; 
sum += ~t & data[c];

这消除了分支并用一些按位操作替换它。

这段代码到底在做什么,为什么它是等价的?

4

1 回答 1

2

它首先将比较转换为 128 的减法。

然后结果的符号(减法是否低于 128)被扩展为全零或全一,这and被添加到要添加的值,如果减法的结果为负,则将其归零。

于 2014-10-31T20:59:09.420 回答