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

时间:2012-08-19 11:19:50

标签: c if-statement bit-manipulation

我正在阅读this answer,并提到此代码;

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

可以替换为这个;

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

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

4 个答案:

答案 0 :(得分:27)

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

当且仅当data[c]大于或等于128时,才明确将sum添加到data[c]。很容易证明

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

是等效的(当data仅保留正值时,它会这样做):

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

在案例sum0 & data[c](因此data[c] < 128)的情况下,第二行将0xFFFFFFFF & data[c] data[c]添加到data[c] >= 128(因此为零) {{1}}。

答案 1 :(得分:3)

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

  

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

(data[c] - 128) >> 31; //当数据[c]大于或等于128时,这只是试图提取数据[c]的符号位,如果它小于128那么(数据[c] - 128)将自动切换到某个负数,从而设置符号位。

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

答案 2 :(得分:0)

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

等于

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

表示如果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

答案 3 :(得分:-1)

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