if-statement和bitwise操作在这个例子中是如何相同的?

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

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

可以用这个替换;

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

我很难理解这一点。 有人可以解释按位运算符如何实现if语句的作用吗?

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

当且仅当data[c]大于或等于128时,清楚地将data[c]添加到sum很容易certificate

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

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

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

0 & data[c]的情况下,在data[c] < 1280xFFFFFFFF & data[c] (所以data[c] )的情况下,第二行加0 & data[c] (所以为零) data[c] >= 128

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

(注意,这个hack并不完全等同于原始的if语句。但在这种情况下,它对data []的所有输入值都有效。)

(data[c] - 128) >> 31; //当数据[c]大于或等于128时,这试图仅提取数据[c]的符号位,如果小于128,则数据[c] – 128)将自动转换为某些负数数字因此设置符号位。

sum += ~t & data[c]; 将值数据[c]与1或0取决于符号位的补充值。如果值( (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 ie when the sign of data[c] - 128 is positive 

int t =(data [c] – 128)>> 31; 这里data [c]是int数据类型,int数据类型大小是4 bytes.if(data [c] – 128)是正数,第31位是符号位,它的值是0.if(data [c] – 128)是负的,然后第31位将是1.然后右移31次只给你符号位。 抱歉英语不好