我只是想问一个问题。
!x
与x==0
相同吗?
我使用这些来测试条件(中断),在这种情况下x
只是一位。
我正在使用它的代码示例:
if(PIR1bits.SSPIF & !SSPCON2bits.ACKSTAT)
{
// some operation
}
答案 0 :(得分:4)
为什么不做简单的桌子?
x !x x==0
0 1 1
1 0 0
因此,if(!x)
或if(x==0)
的评估在您的情况下应该相同。
修改强>
准确地说,在您的代码中,&
运算符引用了按位AND运算符,因此只有PIR1bits.SSPIF=1
和SSPCON2bits.ACKSTAT=0
答案 1 :(得分:0)
正如coincoin所说,您可能希望您的代码能够阅读
if(PIR1bits.SSPIF && !SSPCON2bits.ACKSTAT) {...}
这样你就可以使用逻辑'和'而不是按位'和'。按位运算符(&,|,^,〜)通常用于实现要在一个字节或字内测试,设置或清除位的掩码。如果在if语句中使用它们,则存在可能难以调试的奇怪行为。
您可以执行
之类的操作if (i & 0x80) {...}
测试是否设置了第15位,或类似
uint16_t a, b;
a = b & 0xfff0;
清除b的低半字节并将其指定给a。