当我准备面试的时候

count=0;
for(i=1;i<=n;i++)
{
    i=(i)&(i-1);    //line 4
    count++;
}
return count;
//--------

i=21,22 same count. For what other values of i we get same count?

我不明白4号线在做什么。
有谁能帮我把程序的输出给我吗。。。。。
在链接中找到上述问题(9)http://placement.freshersworld.com/placement-papers/Mentor-Graphics/Placement-Paper-Aptitude-General-32412

最佳答案

警告
在第二次检查代码之后,我必须说,它可能编译得很好,但是您将遇到一个死锁,我认为:

for (i=1;i<=n;++i)
{
    i = (i)&(i-1);
    cont++;
}

会发生什么?当i1时:
i = 1&0;//is what line 4 boils down to

因此i将是0,如果循环启动,则n将至少为1,因此循环条件仍然为真:
i<=n => 0 <= n ==> true

因此i1i++)递增,然后整个过程再次开始。第四行再次计算为:
i = 1&0;//assigns 0 again to i

你又回到原点了。这个程序永远不会终止,它只是一遍又一遍地重复同一个操作。。。
好吧,&是按位AND运算符。当使用它时,就像在代码片段中使用2个整数一样,它返回两个数字中“打开”或设置为1的位。纯英语:表达式的计算结果为一组新的位,这两个位都是在两个操作数中设置的。例如,当i为2时:
00000010 //2
00000001 // i - 1
--------
00000000

在这种情况下,在这两种情况下都将非位设置为1。事实上,这将是2的所有幂的事实,因为2的幂看起来像是二进制的:
00000010
00000100
00001000

2减1的幂看起来是这样的:
00001000//power of 2
00000111

在所有其他情况下,在两种情况下至少有1位设置为1
00000110
00000101
--------
00000100

容易的。
有关C中按位运算符的更完整的概述和详细说明,您可以始终参考the wiki on bitwise operators in C

08-24 18:46