我一直在查看二进制计数器的示例代码,我很难完全理解使用按位操作切换每个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。>
答案 0 :(得分:2)
分配给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变量中。
在现实世界的嵌入式系统中,更常规的方法是使用引脚0,1,2将所有3个LED布线到同一端口,然后简单地执行以下操作:
for (int i = 0; i < 8; i++)
{
PORT = i;
}