语句和按位操作在这个例子中是相同的?

我正在阅读这个答案,并提到这个代码;

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

可以用这个替换;

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

我很难理解这一点。 有人可以解释一下,如果声明的做法,按位运算符如何实现?


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

当且仅当data[c]大于或等于128时,显然将data[c] sum很容易证明

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

是等价的(当data只包含正值时,它会这样做):

当且仅当data[c]大于或等于128时, data[c] - 128为正。算术上右移31,它变为全1(如果它小于128)或全零(如果它更大或等于128)。

然后,第二行添加到sum或者0 & data[c]所以零)的情况下该data[c] < 1280xFFFFFFFF & data[c]这样data[c]的情况下该data[c] >= 128


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

(请注意,这种破解不等同于原始的if语句,但在这种情况下,它对于数据[]的所有输入值都是有效的。)

(data[c] - 128) >> 31; //当data [c]大于或等于128时,它试图仅提取数据的符号位[c],如果小于128那么(data [c] - 128)将自动转换为负值数字从而设置符号位。

sum += ~t & data[c]; 将取值为1或0的数值数据[c]取决于符号位的补充值。如果值( (data[c] - 128) )为负,则不会有任何值加到sum


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

等于

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

这意味着如果data[c] - 128不是负数,则添加data[c]来求和。 所以我们需要提取data[c] - 128符号data[c] - 128 。 由于数据是32位int数组。 所以为了得到符号,我们需要算术地将其移位32 - 1 = 31次。 所以

int t = (data[c] - 128) >> 31; //where t is the sign of data[c] - 128, 0 for positive and 1 for negative
sum += ~t & data[c]; //Add data[c] in sum if t = 0 i.e when the sign of data[c] - 128 is positive
链接地址: http://www.djcxy.com/p/6195.html

上一篇: statement and bitwise operations same in this example?

下一篇: Classic singleton vs. Lazy with Java 8 Performance