无法理解这个C程序在做什么?

时间:2013-11-04 06:43:52

标签: c

当我准备接受采访时,我得到了以下内容

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行正在做什么。 任何人都可以帮助我,并给我程序的输出.....

在链接http://placement.freshersworld.com/placement-papers/Mentor-Graphics/Placement-Paper-Aptitude-General-32412

中找到上述问题(9)

4 个答案:

答案 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++;
}

会发生什么?当i1时:

i = 1&0;//is what line 4 boils down to

所以i将是0,如果循环开始,则n将至少为1,因此循环条件仍然为真:

i<=n => 0 <= n ==> true

所以i增加1i++),整个事情再次开始。第四行再次评估:

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