Сравнение битов в цикле на 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
в двоичном