c-逐位操作!x和x==0

  • 本文关键字:位操作 c xc8
  • 更新时间 :
  • 英文 :


我只想问一个问题。

!xx==0相同吗?

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

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

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

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

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

edit准确地说,在您的代码中,&运算符指的是按位AND运算符,因此您的条件只能在PIR1bits.SSPIF=1SSPCON2bits.ACKSTAT=0为true

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

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

因此,您使用的是逻辑"and",而不是位"and"。逐位运算符(&,|,^,~)通常用于实现要测试、设置或清除字节或字中的位的掩码。如果在If语句中使用它们,则可能会出现难以调试的怪异行为。

你可以做之类的事情

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

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

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

清除b的下半字节并将其分配给a.

相关内容

  • 没有找到相关文章

最新更新