Побитовая операция! X и x==0

Я просто хочу задать вопрос.

Является !x такой же как x==0?

Я использую их для проверки условия (прерывания), в данном случае x только один бит. Пример кода, где я его использую:

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

2 ответа

Почему бы не сделать простой стол?

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

Таким образом, оценка if(!x) или же if(x==0) должно быть то же самое в вашем случае.

отредактируйте Просто чтобы уточнить, что в вашем коде & оператор относится к побитовому оператору AND, поэтому ваше условие может быть истинным, только если PIR1bits.SSPIF=1 а также SSPCON2bits.ACKSTAT=0

Как отмечает coincoin, вы, вероятно, хотите, чтобы ваш код читался

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

так что вы используете логические 'и', а не побитовые 'и'. Битовые операторы (&, |, ^, ~) обычно используются для реализации масок, в которых вы хотите проверить, установить или очистить биты внутри байта или слова. Если вы используете их в операторах if, вы рискуете странным поведением, которое может быть трудно отладить.

Вы можете делать такие вещи, как

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

проверить, установлен ли бит 15 или что-то вроде

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

очистить нижний кусочек b и назначить его на a.

Другие вопросы по тегам