分析&,&&和|这段代码?

时间:2012-08-27 15:39:38

标签: c conditional mips nios bit-masks

我想说明与此代码的区别

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(最低有效位),即最右边的位而不保留其他位。 |代替它做什么?如果我做了这个改变会有什么不同?

3 个答案:

答案 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)为条件是重言式。