位比较代码,希望有助于理解它

Bit comparison code, would like help understanding it

我一直在查看二进制计数器的示例代码,但我很难完全理解 for 循环中发生了什么,使用按位操作切换每个 ledOnOffState。

我目前遇到的问题是 (i & 1)、(i & 2) 和 (i & 4),对于从 0 - 7 计数的每个 i 数字.

我认为对于循环中的每个 i 小数,它们的二进制值正在用于针对 ledOnOffState 的 () 中 1、2 和 4 的二进制值的操作。但我不太确定这些部分到底在做什么。例如,当 i = 3、011 时,(3 & 1)、(3 & 2) 和 (3 & 4) 分别为 011 的二进制值生成 1、1 和 0?

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);

如果它只比较一位,例如 (3 & 1) 的 2^0 位和 (3 & 2) 的 2^1 位以及 (3 & 的 2^2 位4) 在这些情况下,这对我来说很有意义,因为它分别导致 1、1、0。

但我怀疑情况并非如此,我的另一个想法是它可能正在对每个位执行 3 个按位 AND 运算,如果其中任何一个为真,它会将 ledOnOffState 值更改为 TRUE,如果 none 为 true 则更改为 FALSE。

我使用 ledOnOffState = (i & 3) 尝试了代码,结果让我认为后一种情况可能是正确的,因为只有 0 和 4 十进制值是 0,但所有其他值都是 1。

任何分配给 bool 的非零整数都会隐式转换为 1/true,否则 0/false。掩码 1、2 和 4 分别简单地引用值的 3 个最低有效位,二进制 001010100。如果设置了屏蔽位,每个表达式的计算结果将是 true.

这意味着这段代码根据这个生成一个真理table:

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 变量中。

一种更传统的方法,就像在现实世界的嵌入式系统中所做的那样,是使用引脚 0、1、2 将所有 3 个 LED 路由到同一个端口,然后简单地执行以下操作:

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