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

问题描述 投票:0回答:1

我一直在查看二进制计数器的示例代码,我很难完全理解for循环中使用按位运算切换每个ledOnOffState的情况。

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

我认为正在发生的事情是循环中的每个小数,它们的二进制值用于针对ledOnOffState的()中的1,2和4的二进制值的操作。但我不确定这些部分到底在做什么。例如,当i = 3,01时,对于(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和4)的2 ^ 2比特。这对我来说是有意义的,因为它分别导致1,1,0。

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

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

c boolean boolean-logic boolean-operations
1个回答
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.