2014-10-31 58 views
0

我正在看这个问题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

它首先转换与128

然后结果的符号的比较,以减法(是否减去去下面128)被扩展成全零或全一,这是被添加and ED为值如果减法结果为负,则将其归零。