Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在本例中,if语句和按位操作如何相同?_C_If Statement_Bit Manipulation - Fatal编程技术网

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