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

时间:2014-10-31 20:53:44

标签: c if-statement bitwise-operators branch-prediction

我正在阅读这个问题Why is it faster to process a sorted array than an unsorted array?以及提供的最佳答案 Mysticial。答案很好地解释了正在发生的事情和原因,也说了这个:

  

那么可以做些什么呢?

     

如果编译器无法将分支优化为条件   如果你愿意牺牲,你可以尝试一些黑客攻击   性能可读性。

     

替换:

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

使用:

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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