Код сравнения бит, хотел бы помочь понять это - PullRequest
0 голосов
/ 27 марта 2019

Я рассматривал пример кода для двоичного счетчика, мне трудно полностью понять, что происходит в цикле for для переключения каждого из ledOnOffState с помощью побитовой операции.

Это (i & 1), (i & 2) и (i & 4), с которыми у меня сейчас есть небольшая проблема, для каждого из чисел i, считающихся от 0 до 7.

Я думаю, что для каждого десятичного числа i внутри цикла их двоичные значения используются для операции с двоичными значениями для 1, 2 и 4 в () для ledOnOffState. Но я не совсем уверен, что именно делают эти части. Например, когда i = 3, 011, что происходит для каждого из (3 & 1), (3 & 2) и (3 & 4), чтобы получить 1, 1 и 0 соответственно для двоичного значения 011?

bool led1OnOffState; // true = 1 = ON (HIGH), false = 0 = OFF (LOW)
bool led2OnOffState;
bool led3OnOffState;

int iterations = 2;

for (int iteration = 0; iteration < iterations; iteration++)
{
     // a for loop that counts from 0 to 7
    for (int i = 0; i < 8; i++)
    {
        // check to see if the 1, 2, and 4 bits are set for the current counter number
        led1OnOffState = (i & 1); // check for binary bit value 1 = true (1) or false (0)
        led2OnOffState = (i & 2); // check for binary bit value 2
        led3OnOffState = (i & 4); // check for binary bit value 4

        printf("The decimal %d is %d%d%d in binary\n", i, led3OnOffState, led2OnOffState, led1OnOffState);

Если он сравнивает только один бит, например, 2 ^ 0 бит для (3 & 1) и 2 ^ 1 бит для (3 & 2) и 2 ^ 2 бит для (3 & 4) в этих случаях это имело бы смысл для меня, поскольку это приводит к 1, 1, 0 соответственно.

Но я подозреваю, что это не совсем так, моя другая мысль состоит в том, что, возможно, он выполняет 3 побитовых операции И для каждого из битов, и если любой из них является истинным, он меняет значение ledOnOffState на ИСТИНА, если ни один не является истинным изменено на ЛОЖЬ.

Я попробовал код, используя ledOnOffState = (i & 3), и результаты привели меня к мысли, что последний случай может быть верным, так как только 0 и 4 десятичных значения были 0, но все остальные были равны 1 с.

1 Ответ

2 голосов
/ 27 марта 2019

Любое ненулевое целое число, присвоенное bool, неявно преобразуется в 1 / true, в противном случае 0 / false. Маски 1, 2 и 4 соответственно просто относятся к 3 младшим значащим битам значения, двоичным 001, 010, 100. Если установлен маскированный бит, каждое выражение будет иметь значение true.

Это означает, что этот код генерирует таблицу истинности в соответствии с этим:

i     LED1 LED2 LED3
0      0    0    0
1      1    0    0
2      0    1    0
3      1    1    0
4      0    0    1
...

То есть код просто выполняет двоичный отсчет и распределяет его по 3 переменным bool.

Более традиционный подход, как в реальных встроенных системах, состоит в том, чтобы направить все 3 светодиода на один и тот же порт с помощью контакта 0,1,2, а затем просто сделать это:

for (int i = 0; i < 8; i++)
{
  PORT = i;
}
...