我一直在查看二进制计数器的示例代码,我很难完全理解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。
分配给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;
}