位比较代码,想帮助您理解它

时间:2019-03-27 14:25:13

标签: c boolean boolean-logic boolean-operations

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

我现在遇到的麻烦是(i&1),(i&2)和(i&4),因为每个i数字从0到7。 / p>

我认为对于循环中的每个i小数,发生的事情是它们的二进制值被用于针对ledOnOffState的()中的1、2和4的二进制值进行运算。但是我不确定这些部分到底在做什么。例如,当i = 3、011时,(3&1),(3&2)和(3&4)中的每一个分别为011的二进制值产生1、1和0是什么? / p>

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&4)的2 ^ 2位在这些情况下,这对我来说很有意义,因为它分别导致1、1、0。

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

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

1 个答案:

答案 0 :(得分:2)

分配给bool的任何非零整数都隐式转换为1 / true,否则转换为0 / false。掩码1、2和4分别简单地引用了值的3个最低有效位,即二进制001010100。如果设置了屏蔽位,则每个表达式的计算结果为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变量中。

在现实世界的嵌入式系统中,更常规的方法是使用引脚0,1,2将所有3个LED布线到同一端口,然后简单地执行以下操作:

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