按位运算!x和x == 0

时间:2015-05-12 13:57:43

标签: c xc8

我只是想问一个问题。

!xx==0相同吗?

我使用这些来测试条件(中断),在这种情况下x只是一位。 我正在使用它的代码示例:

if(PIR1bits.SSPIF & !SSPCON2bits.ACKSTAT)
{
      // some operation
}

2 个答案:

答案 0 :(得分:4)

为什么不做简单的桌子?

x  !x  x==0
0   1   1
1   0   0

因此,if(!x)if(x==0)的评估在您的情况下应该相同。

修改 准确地说,在您的代码中,&运算符引用了按位AND运算符,因此只有PIR1bits.SSPIF=1SSPCON2bits.ACKSTAT=0

时,您的条件才能成立

答案 1 :(得分:0)

正如coincoin所说,您可能希望您的代码能够阅读

if(PIR1bits.SSPIF && !SSPCON2bits.ACKSTAT) {...}

这样你就可以使用逻辑'和'而不是按位'和'。按位运算符(&,|,^,〜)通常用于实现要在一个字节或字内测试,设置或清除位的掩码。如果在if语句中使用它们,则存在可能难以调试的奇怪行为。

您可以执行

之类的操作
if (i & 0x80) {...}

测试是否设置了第15位,或类似

uint16_t a, b;
a = b & 0xfff0;

清除b的低半字节并将其指定给a。