C 在本例中,if语句和按位操作如何相同?
我正在阅读,有人提到这段代码C 在本例中,if语句和按位操作如何相同?,c,if-statement,bit-manipulation,C,If Statement,Bit Manipulation,我正在阅读,有人提到这段代码 if (data[c] >= 128) sum += data[c]; 可以用这个来代替 int t = (data[c] - 128) >> 31; sum += ~t & data[c]; 我很难理解这一点。有人能解释一下位运算符是如何实现if语句的吗?intt=(data[c]-128)>>31; 总和+=~t和数据[c] (请注意,此破解与原始破解并不完全相同 但在本例中,它对的所有输入值都有效 数据[]) (数据[c]
if (data[c] >= 128)
sum += data[c];
可以用这个来代替
int t = (data[c] - 128) >> 31;
sum += ~t & data[c];
我很难理解这一点。有人能解释一下位运算符是如何实现if语句的吗?intt=(data[c]-128)>>31;
总和+=~t和数据[c]代码>
(请注意,此破解与原始破解并不完全相同
但在本例中,它对的所有输入值都有效
数据[])
(数据[c]-128)>>31代码>//当数据[c]大于或等于128时,这试图仅提取数据[c]的符号位,如果小于128,则(数据[c]-128)将自动转换为负数,从而设置符号位
和sum+=~t&data[c]代码>
将和值数据[c]加1或0,具体取决于符号位的补充值。表示如果值((数据[c]-128)
)为负值,则不会向和添加任何内容
if (data[c] >= 128)
sum += data[c];
当且仅当数据[c]
大于或等于128时,才将数据[c]
清楚地添加到总和中。这很容易表现出来
int t = (data[c] - 128) >> 31;
sum += ~t & data[c];
等效(当数据
仅包含正值时,它会这样做):
data[c]-128
为正当且仅当data[c]
大于或等于128。将其算术右移31,则变为全1(如果小于128)或全零(如果大于或等于128)
然后,第二行在data[c]<128
的情况下添加到sum
(因此为零),或者在data[c]>=128
的情况下添加到0xFFFFFFFF&data[c]
(因此data[c]
)
if (data[c] >= 128)
sum += data[c];
等于
if (data[c] - 128 >= 0)
sum += data[c];
这意味着如果数据[c]-128
不是负数,则将数据[c]
相加。所以我们需要提取数据[c]-128的符号。As数据是32位整数数组。所以为了得到符号,我们需要对它进行算术移位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