Побитовая операция! 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.