Сравнение битов в цикле на AVR

Я изучаю битовую логику в C на AVR, и у меня есть проблема.

Я хочу сравнить бит "i" (справа) из переменной int8_t и, если это 1, выполнить следующую инструкцию, но она не работает. Вот что я пишу:

if (variable & (1<<i)==(1<<i)) instruction;

В примере для следующих данных:

uint8_t dot=0101;
PORTC=1;
for (int i=0; i<4; i++)
{
    PORTB = fourDigit[i];
    if (dot & (1<<i)==(1<<i)) PORTB--;
    PORTC<<=1;
}

Точка (как она подключена к PB0) должна гореть на первой и третьей цифре, но в настоящее время она загорается на каждой цифре. В чем проблема?

Спасибо за ваше время.

1 ответ

Решение

Это делается с помощью битовой маскировки. Если вы хотите проверить, является ли iнемного a 1, вы будете делать что-то вроде этого:

if (a & (1 << i))
{
    // Do something
}

Таким образом, все биты a кроме i'это будет И с нулями, получая значение ноль. iбудет добавлено и 1Таким образом, не меняя его значение. Итак if условие будет истинным, если бит не равен нулю, и ложным в противном случае.
Код сравнения, который вы представляете, также должен работать, но я подозреваю, что dot переменная не содержит значение, которое вы думаете, оно содержит. uint8_t dot=0101; делает его равным 101 в восьмеричной базе (из-за начального нуля) или 65 в десятичном. Не 101 в двоичном

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