“二元与”运算符如何在 while 循环中工作?
How does the “binary and” operator work in a while loop?
这是一个输出为 7 的小程序(我以为输出是 6,因为 126 & 127 = 6 使用二进制系统):
int main() {
int x = 127, count = 0;
while(x) {
x &= (x - 1);
count++;
}
printf("%d", count);
}
我不明白为什么 1 加到 6 (1 + 6 = 7)。
您在解释中混淆了变量。这里发生的是变量 count
将递增(原始值为零),而 x
的值 而不是 零。同时,虽然 x
的值不为零,但 x
和 x-1
的按位与运算被分配给 x
.
最后,打印的结果是不是x
,而是count
.
并且,根据我的 Python 解释器,此代码的逻辑以 x
的值为 0
结束,并且 count
变为 7
,因此x
在变为零之前与其前身进行了 AND 赋值 7
次。
这是在扩展了 while
循环的伪代码中发生的事情:
x = 127;
c = 0;
x != 0 thus {
x = x & x - 1 thus x == 127 & 126 thus x == 126;
count += 1 thus count == 1;
}
x != 0 thus {
x = x & x - 1 thus x == 126 & 125 thus x == 124;
count += 1 thus count == 2;
}
x != 0 thus {
x = x & x - 1 thus x == 124 & 123 thus x == 120;
count += 1 thus count == 3;
}
x != 0 thus {
x = x & x - 1 thus x == 120 & 119 thus x == 112;
count += 1 thus count == 4;
}
x != 0 thus {
x = x & x - 1 thus x == 112 & 111 thus x == 96;
count += 1 thus count == 5;
}
x != 0 thus {
x = x & x - 1 thus x == 96 & 95 thus x == 64;
count += 1 thus count == 6;
}
x != 0 thus {
x = x & x - 1 thus x == 64 & 63 thus x == 0;
count += 1 thus count == 7;
}
x == 0, thus {
count == 7, thus print(count) outputs "7";
}
顺便说一句,126 & 127 == 0b1111110 & 0b1111111 == 0b1111110 == 126.
让我们分析一下你的程序在做什么:
x
以 127 开头。
while(x){
将循环 而 x 为真。在这种情况下,直到 x
是 !=0
.
因此,在您的循环中,您执行 x &= (x-1);
,这是布尔运算 AND
,然后递增 count
:
1111111 ; 127
& 1111110 ; 126
--------
1111110 ; 126 ; count goes 1
& 1111101 ; 125
-------
1111100 ; 124 ; count goes 2
& 1111011 ; 123
-------
1111000 ; 120 ; count goes 3
& 1110111 ; 119
-------
1110000 ; 112 ; count goes 4
& 1101111 ; 111
-------
1100000 ; 96 ; count goes 5
& 1011111 ; 95
-------
1000000 ; 64 ; count goes 6
& 0111111 ; 63
-------
0000000 ; 0 ; count goes 7
这里,x
到0,while
停止。
127在二进制中为1111111,126为1111110。127&126将得到126。while循环迭代直到x&(x-1)的结果为零。这里,while 循环迭代了 7 次,因此,计数递增 7 次,之后 x 变为零。答案是 7,因为您在此处打印 count 的值。
这是一个输出为 7 的小程序(我以为输出是 6,因为 126 & 127 = 6 使用二进制系统):
int main() {
int x = 127, count = 0;
while(x) {
x &= (x - 1);
count++;
}
printf("%d", count);
}
我不明白为什么 1 加到 6 (1 + 6 = 7)。
您在解释中混淆了变量。这里发生的是变量 count
将递增(原始值为零),而 x
的值 而不是 零。同时,虽然 x
的值不为零,但 x
和 x-1
的按位与运算被分配给 x
.
最后,打印的结果是不是x
,而是count
.
并且,根据我的 Python 解释器,此代码的逻辑以 x
的值为 0
结束,并且 count
变为 7
,因此x
在变为零之前与其前身进行了 AND 赋值 7
次。
这是在扩展了 while
循环的伪代码中发生的事情:
x = 127;
c = 0;
x != 0 thus {
x = x & x - 1 thus x == 127 & 126 thus x == 126;
count += 1 thus count == 1;
}
x != 0 thus {
x = x & x - 1 thus x == 126 & 125 thus x == 124;
count += 1 thus count == 2;
}
x != 0 thus {
x = x & x - 1 thus x == 124 & 123 thus x == 120;
count += 1 thus count == 3;
}
x != 0 thus {
x = x & x - 1 thus x == 120 & 119 thus x == 112;
count += 1 thus count == 4;
}
x != 0 thus {
x = x & x - 1 thus x == 112 & 111 thus x == 96;
count += 1 thus count == 5;
}
x != 0 thus {
x = x & x - 1 thus x == 96 & 95 thus x == 64;
count += 1 thus count == 6;
}
x != 0 thus {
x = x & x - 1 thus x == 64 & 63 thus x == 0;
count += 1 thus count == 7;
}
x == 0, thus {
count == 7, thus print(count) outputs "7";
}
顺便说一句,126 & 127 == 0b1111110 & 0b1111111 == 0b1111110 == 126.
让我们分析一下你的程序在做什么:
x
以 127 开头。
while(x){
将循环 而 x 为真。在这种情况下,直到 x
是 !=0
.
因此,在您的循环中,您执行 x &= (x-1);
,这是布尔运算 AND
,然后递增 count
:
1111111 ; 127
& 1111110 ; 126
--------
1111110 ; 126 ; count goes 1
& 1111101 ; 125
-------
1111100 ; 124 ; count goes 2
& 1111011 ; 123
-------
1111000 ; 120 ; count goes 3
& 1110111 ; 119
-------
1110000 ; 112 ; count goes 4
& 1101111 ; 111
-------
1100000 ; 96 ; count goes 5
& 1011111 ; 95
-------
1000000 ; 64 ; count goes 6
& 0111111 ; 63
-------
0000000 ; 0 ; count goes 7
这里,x
到0,while
停止。
127在二进制中为1111111,126为1111110。127&126将得到126。while循环迭代直到x&(x-1)的结果为零。这里,while 循环迭代了 7 次,因此,计数递增 7 次,之后 x 变为零。答案是 7,因为您在此处打印 count 的值。