【发布时间】:2019-08-18 03:55:41
【问题描述】:
我一直在查看二进制计数器的示例代码,我很难完全理解使用按位操作切换每个 ledOnOffState 的 for 循环中发生了什么。
对于从 0 到 7 计数的每个 i 数字,我现在遇到了一些麻烦的是 (i & 1)、(i & 2) 和 (i & 4)。
我认为,对于循环中的每个 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 & 4) 的 2^2 位在这些情况下,这对我来说是有意义的,因为它分别导致 1、1、0。
但我怀疑情况并非如此,我的另一个想法是它可能正在对每个位执行 3 次按位与运算,如果其中任何一个为真,它会将 ledOnOffState 值更改为 TRUE,如果没有一个为真的话更改为 FALSE。
我使用 ledOnOffState = (i & 3) 尝试了代码,结果让我认为后一种情况可能是正确的,因为只有十进制值 0 和 4 为 0,而其他所有值都为 1。
【问题讨论】:
-
(i & x)表达式获得 非零 值,而i中的相应 位 非零。由于这些被分配给bool变量,它们只能具有非零值1或true。
标签: c boolean boolean-logic boolean-operations