这是一个输出为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)。
答案 0 :(得分:3)
您在解释中混合了变量。这里发生的是变量count
将递增(原始值为零),而x
的值不为零。同时,虽然x
的值不为零,但x
和x-1
的按位与“”分配给x
。
最后,打印结果不是 x
,而是count
。
根据我的Python解释器,此代码的逻辑以x
结尾,其值0
和count
变为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开头。
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的值。