代码说明

时间:2014-11-12 14:41:58

标签: c

我不知道这是否是发布的正确SE网站,但我会尝试两种方式, 从answer开始。建议这个

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

可以变成这个:

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

有人可以向我解释这是如何运作的吗?

1 个答案:

答案 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添加到总和不会改变它所以一切都很好。