-1

我只是想问一个问题。

!x一样的x==0吗?

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

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

2 回答 2

4

为什么不做一个简单的表?

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

if(!x)所以在你的情况下, or的评估if(x==0)应该是相同的。

编辑 只是为了准确地说,在您的代码中,&运算符指的是按位 AND 运算符,因此您的条件只有在PIR1bits.SSPIF=1并且SSPCON2bits.ACKSTAT=0

于 2015-05-12T14:08:50.487 回答
0

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

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

这样您就可以使用逻辑“与”而不是按位“与”。位运算符(&、|、^、~)通常用于实现掩码,以便在字节或字中测试、设置或清除位。如果在 if 语句中使用它们,则可能会出现难以调试的奇怪行为。

你可以做类似的事情

if (i & 0x80) {...}

测试是否设置了第 15 位,或者类似的东西

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

清除 b 的低半字节并将其分配给 a。

于 2015-05-12T17:04:50.097 回答