当我准备接受采访时,我得到了以下内容
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)答案 0 :(得分:3)
我&amp;如果i是2的幂或者i是0,则(i-1)返回0,否则返回非零。
在检查时,我将被设置为零,计数递增,然后我将再次变为1,然后是0,依此类推。
我不确定此循环是否会终止。
答案 1 :(得分:3)
警告的
在第二次查看你的代码之后,我必须说,它可能编译得很好,但你 会遇到死锁,我想:
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
答案 2 :(得分:1)
该行
i = i & (i-1)
清除i
的最低设置位。所以像
while (i) {
i = i & (i-1);
count++; }
计算i
中的设置位数。请注意,这仅在i
具有无符号类型时才有效。如果i
已签名且为否定,则会导致未定义的行为。
你提供的链接可能是一个错误记住的问题(在while (i)
之后)询问有关这样的循环。
评论“i = 21,22相同计数”是21(10101)和22(10110)具有相同设定位数的提示。
我必须承认,当我第一次阅读你的问题时,我实际上看到了while(i)
循环,因为i=(i)&(i-1); count++;
行只在这种情况下才有意义,并且它是如此常见的“技巧问题“成语。
答案 3 :(得分:0)
&安培;是一个按位运算符。它计算如下:
例如:i = 8
i & (i-1) is (1000) AND (0111) results 0000.
如果你运行程序,它会进入无限循环,因为
i=1 and (i) & (i-1) gives 0
每次我变成1
所以,修改代码如下,我希望你能得到答案:
for(i=1;i<=n;i++)
{
count=(i)&(i-1);
printf(" i= %d count= %d",i,count);
}
结果如下:
i= 1 count= 0
i= 2 count= 0
i= 3 count= 2
i= 4 count= 0
i= 5 count= 4
i= 6 count= 4
i= 7 count= 6
i= 8 count= 0
i= 9 count= 8
i= 10 count= 8
i= 11 count= 10
i= 12 count= 8
i= 13 count= 12
i= 14 count= 12
i= 15 count= 14
i= 16 count= 0
i= 17 count= 16
i= 18 count= 16
i= 19 count= 18
i= 20 count= 16
i= 21 count= 20
i= 22 count= 20
i= 23 count= 22
i= 24 count= 16
i= 25 count= 24