“二进制和”运算符如何在while循环中工作?

时间:2015-08-28 19:55:12

标签: c bitwise-operators

这是一个输出为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)。

3 个答案:

答案 0 :(得分:3)

您在解释中混合了变量。这里发生的是变量count将递增(原始值为零),而x的值为零。同时,虽然x的值不为零,但xx-1的按位与“”分配给x

最后,打印结果不是 x,而是count

根据我的Python解释器,此代码的逻辑以x结尾,其值0count变为7,因此x为并且在变为零之前与其前任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";
}

BTW, 126& 127 == 0b1111110& 0b1111111 == 0b1111110 == 126

答案 1 :(得分:0)

让我们分析一下您的计划正在做什么:

x以127开头。

当 x为真时,

while(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停止。

答案 2 :(得分:0)

127在二进制系统中是1111111,126111010,127和126将给出126. while循环迭代直到x&(x-1)的结果为零。这里,while循环迭代7次,因此,计数递增7次,之后x变为零。答案是7,因为你在这里打印count的值。