繁体   English   中英

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

[英]Can't understand what this C program is doing?

当我准备面试时,我得到了以下内容

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)

如果i为2的幂或i为0,则i&(i-1)返回0,否则返回非零。

在检查时,我将设置为零,计数递增,然后我将再次变为1,然后为0,依此类推。

我不确定该循环是否会终止。

警告
寻找你的代码的第二时间之后,我必须说,这可能编译就好了,但要遇到一个僵局,我认为:

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,因此循环条件仍然为true:

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中按位运算符的更完整概述和详细说明,您可以始终参考C中按位运算符的Wiki。

线

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++; i=(i)&(i-1); count++; 实际上只有在这种情况下才有意义,而且它是一个如此常见的“技巧问题”惯用法。

&是按位与运算符,其计算如下:

例如: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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM