1

我想说明这段代码的区别

for(i = 32; i > 0; i--)
 {
   if(a&1 != 0) //bit mask
     total += b;
   a = a >> 1;
   b = b << 1; 
 }

在代码中 & 用于“屏蔽”一点,如果使用它,结果将完全不同&&。在那种情况下,表达式1已被解释为真值 ( TRUE),而不是用于保留其中一位的一位位置。正确的?但是,如果我这样做了,会发生什么:

for(i = 32; i > 0; i--)
 {
   if(a|1 != 0) //bit mask
     total += b;
   a = a >> 1;
   b = b << 1; 
 }

在第一种情况下,1它用于仅保留 LSB(最低有效位),即最右边的位,没有别的。取而代之的是什么|?如果我做这个改变会有什么不同?

4

3 回答 3

4
a&1 != 0

应该

(a&1) != 0

!=的优先级高于&。否则 a&1 != 0读作a & (1 != 0).

(a|1 != 0).

于 2012-08-27T15:41:47.233 回答
1
(a | 1 ) != 0

永远是真的。它具有返回 a 但设置的最低位显然不是 0 的效果(至少在我见过的任何 C 实现中都没有)。相似地

(a || 1)

始终为真,因为 1 在 C 中为真,任何事物或真为真。

于 2012-08-27T15:49:31.140 回答
1

在这种情况下,您省略括号a&1并不会改变程序的含义。

由于!=具有优先权,它将评估1 != 0which is1和 since!=0是一个完全多余的语句,不管你说if (a OP (1 != 0))or if ((a OP 1) != 0)

现在,我们可以查看您的第二个陈述并按照您的意图进行解释:(a | 1) != 0. 所有位都为零的唯一值0是在比较的右侧,但在左侧,您始终有一个至少设置了一个位的值(最右边)。因此这些实际上永远不会相等,因此(a | 1) != 0与 相同1

因此,不同之处在于(a & 1)实际检查是否a为奇数并total仅在那时(a | 1)递增,而total在每次迭代中递增,因为条件是重言式。

于 2012-08-27T16:03:08.660 回答