我不知道这是否是发布的正确SE网站,但我会尝试两种方式, 从answer开始。建议这个
if (data[c] >= 128)
sum += data[c];
可以变成这个:
int t = (data[c] - 128) >> 31;
sum += ~t & data[c];
有人可以向我解释这是如何运作的吗?
答案 0 :(得分:3)
正在发生的事情背后的想法是这样的。假设数据[c]> 128.如果确实如此,则执行数据[c] - 128会得到正数(即符号位为0)。向右移动31次会产生一个二进制全数为0的数字。所以t = 00000000000000000000000000000000。
现在,当我们这样做时,它变为全1并且& -ing,数据[c]再次给我们数据[c]。现在我们将它添加到总和中,就像之前一样。
但是如果数据[c]< 128?那么这意味着数据[c] - 128是负数,给出1作为符号位。这意味着t = 11111111111111111111111111111111。因此~t都是0。 & -ing alls with data [c]再次给出全0(即十进制的0)。将0添加到总和不会改变它所以一切都很好。