c-为什么这个带有位运算符的语句与这个if语句相同



我读到这个问题为什么处理排序数组比处理未排序数组更快?以及由神秘。答案很好地解释了正在发生的事情和原因,并说明了这一点:

那么我们能做些什么呢?

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

替换:

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

带有:

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

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

这个代码到底在做什么?为什么它是等效的?

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

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

相关内容

  • 没有找到相关文章

最新更新