当我准备面试的时候
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++;
}
会发生什么?当
i
是1
时:i = 1&0;//is what line 4 boils down to
因此
i
将是0
,如果循环启动,则n
将至少为1,因此循环条件仍然为真:i<=n => 0 <= n ==> true
因此
i
被1
(i++
)递增,然后整个过程再次开始。第四行再次计算为: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