Я рассматривал пример кода для двоичного счетчика, мне трудно полностью понять, что происходит в цикле 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 с.