我想说明与此代码的区别
for(i = 32; i > 0; i--)
{
if(a&1 != 0) //bit mask
total += b;
a = a >> 1;
b = b << 1;
}
代码&amp;用于“掩盖”一点,如果使用&&
,结果将完全不同。在这种情况下,表达式1
被解释为真值(TRUE
),而不是用于保留其中一个位的一位位置。正确?但如果我这样做会发生什么呢?
for(i = 32; i > 0; i--)
{
if(a|1 != 0) //bit mask
total += b;
a = a >> 1;
b = b << 1;
}
在第一种情况下,1
用于仅保留LSB(最低有效位),即最右边的位而不保留其他位。 |
代替它做什么?如果我做了这个改变会有什么不同?
答案 0 :(得分:4)
a&1 != 0
应该是
(a&1) != 0
!=
的优先级高于&
。否则,a&1 != 0
将被视为a & (1 != 0)
。
(a|1 != 0)
相同。
答案 1 :(得分:1)
(a | 1 ) != 0
总是如此。它具有返回但是具有最低位设置但明显不为0的效果(至少在我见过的任何C实现中都没有)。类似地
(a || 1)
总是正确的,因为在C中1为真,任何或真为真。
答案 2 :(得分:1)
在这种情况下,你在a&1
周围省略括号并不会改变程序的含义。
由于!=
具有优先权,因此会评估1 != 0
1
,因为!=0
是一个完全冗余的陈述,您是否说{{}无关紧要1}}或if (a OP (1 != 0))
。
现在,我们可以查看您的第二个陈述并按照您的意图解释它:if ((a OP 1) != 0)
。所有位为零的唯一值是(a | 1) != 0
,它位于比较的右侧,但在左侧,您始终具有至少一个位设置的值(最右侧)。因此,这些永远不会相等,因此0
与(a | 1) != 0
相同。
所以,区别在于1
实际检查(a & 1)
是否为奇数,然后仅a
递增,而total
在每次迭代中递增(a | 1)
为条件是重言式。