Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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 代码解释_C - Fatal编程技术网

C 代码解释

C 代码解释,c,C,我不知道这是否是发布的正确SE站点,但我会尝试任何一种方式, 因此,建议 if (data[c] >= 128) sum += data[c]; 可以转化为: int t = (data[c] - 128) >> 31; sum += ~t & data[c]; 有人能给我解释一下这是怎么回事吗?发生的事情背后的想法是这样的。假设数据[c]>128。如果这是真的,则执行数据[c]-128将产生一个正数(即符号位为0)。将该值右移31次,得到的数字在二进制中

我不知道这是否是发布的正确SE站点,但我会尝试任何一种方式, 因此,建议

if (data[c] >= 128)
     sum += data[c];
可以转化为:

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

有人能给我解释一下这是怎么回事吗?

发生的事情背后的想法是这样的。假设数据[c]>128。如果这是真的,则执行数据[c]-128将产生一个正数(即符号位为0)。将该值右移31次,得到的数字在二进制中都是0。所以t=00000000000000000000

现在,当我们做~t时,它变成了所有的1,&-ing,用数据[c]只会再次给我们数据[c]。现在我们把它加到总和上,就像以前一样


但是如果数据[c]<128呢?这意味着数据[c]-128是负数,给出1作为符号位。也就是说t=11111111111111111111。因此~t都是0&-将所有0与数据[c]相加只会再次给出所有0(即十进制的0)。在总和中加0不会改变它,所以一切都很好。

发生的事情背后的想法是这样的。假设数据[c]>128。如果这是真的,则执行数据[c]-128将产生一个正数(即符号位为0)。将该值右移31次,得到的数字在二进制中都是0。所以t=00000000000000000000

现在,当我们做~t时,它变成了所有的1,&-ing,用数据[c]只会再次给我们数据[c]。现在我们把它加到总和上,就像以前一样


但是如果数据[c]<128呢?这意味着数据[c]-128是负数,给出1作为符号位。也就是说t=11111111111111111111。因此~t都是0&-将所有0与数据[c]相加只会再次给出所有0(即十进制的0)。在总和中加0不会改变它,所以一切都很好。

发生的事情背后的想法是这样的。假设数据[c]>128。如果这是真的,则执行数据[c]-128将产生一个正数(即符号位为0)。将该值右移31次,得到的数字在二进制中都是0。所以t=00000000000000000000

现在,当我们做~t时,它变成了所有的1,&-ing,用数据[c]只会再次给我们数据[c]。现在我们把它加到总和上,就像以前一样


但是如果数据[c]<128呢?这意味着数据[c]-128是负数,给出1作为符号位。也就是说t=11111111111111111111。因此~t都是0&-将所有0与数据[c]相加只会再次给出所有0(即十进制的0)。在总和中加0不会改变它,所以一切都很好。

发生的事情背后的想法是这样的。假设数据[c]>128。如果这是真的,则执行数据[c]-128将产生一个正数(即符号位为0)。将该值右移31次,得到的数字在二进制中都是0。所以t=00000000000000000000

现在,当我们做~t时,它变成了所有的1,&-ing,用数据[c]只会再次给我们数据[c]。现在我们把它加到总和上,就像以前一样



但是如果数据[c]<128呢?这意味着数据[c]-128是负数,给出1作为符号位。也就是说t=11111111111111111111。因此~t都是0&-将所有0与数据[c]相加只会再次给出所有0(即十进制的0)。向总和中添加0不会改变它,因此一切都很好。

StackOverflow会稍微好一点。也许某位版主会为您迁移此内容。顺便说一句,这看起来像是不安全/不可移植的代码,因为>>31正在假设整数中的bis数。此外,如果代码很难理解,那么它将很难维护,因此最好避免使用花哨的东西(当然,你在这里寻求解释,但我建议你自己的代码吻)伙计们,我看到你足够理解它,可以指出它不安全的原因,尽管没有人给出答案是的。这个问题根本不属于这里,因此不应该被回答。天哪,这就像是自命不凡。如果你知道答案,就把它贴出来,它不会花费你任何东西StackOverflow会稍微好一点。也许某位版主会为您迁移此内容。顺便说一句,这看起来像是不安全/不可移植的代码,因为>>31正在假设整数中的bis数。此外,如果代码很难理解,那么它将很难维护,因此最好避免使用花哨的东西(当然,你在这里寻求解释,但我建议你自己的代码吻)伙计们,我看到你足够理解它,可以指出它不安全的原因,尽管没有人给出答案是的。这个问题根本不属于这里,因此不应该被回答。天哪,这就像是自命不凡。如果你知道答案,就把它贴出来,它不会花费你任何东西StackOverflow会稍微好一点。也许某位版主会为您迁移此内容。顺便说一句,这看起来像是不安全/不可移植的代码,因为>>31正在假设整数中的bis数。此外,如果代码很难理解,那么它将很难维护,因此最好避免使用花哨的东西(当然,你在这里寻求解释,但我建议你自己的代码吻)伙计们,我看到你足够理解它,可以指出它不安全的原因,尽管没有人给出答案是的。这个问题根本不属于这里,因此不应该被回答。天哪,这就像是自命不凡。如果你知道答案,就把它贴出来,它不会花费你任何东西StackOverflow会稍微好一点。也许某位版主会为您迁移此内容。顺便说一句,这看起来像是不安全/不可移植的代码,因为>>31正在假设整数中的bis数。此外,如果代码很难理解,那么它将很难维护,因此最好避免使用花哨的东西(当然,您正在这里寻求解释,但我建议您