“二元与”运算符如何在 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 的值不为零,但 xx-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 的值。