为什么这个位操作程序提供错误的O / P?

时间:2014-12-11 16:26:10

标签: bit-manipulation bit

/* This program's aim is to count the number of bits set in an integer */

#include<stdio.h>

int count=0;
int check(int);

int main()
{
int i,r;
char ch;
printf("enter the integer for which you want to check the bits set");
scanf("%d", &i);
r=check(i);
printf("the number of occurance of 1 in the integer is  %d \n", r); /*don't know why isit         printing 0 when i give 4 as input */
    return 0;
}


int check(int j)
{

if((j & 1)==1)
count++;

for(int l=0;l<31;l++)
{

    if( j>>1 & 1)
    count++;

}
return count;

}

这个程序有什么问题?看起来像一些愚蠢的错误或一些概念错误。 我们还需要写j&gt;&gt; 1吗?我们不能简单地写j&gt;&gt;?

1 个答案:

答案 0 :(得分:0)

j >> 1是错误的,所以问你为什么需要写这个没有多大意义。

j >>更没意义。你也不写j +j *,对吗?那么为什么它应该适用于>>

无论如何,你可以通过移动l来测试每一位(这是一个小写的L,而不是一个),或者你可以改变j所以它只需要每次移动1步。这是对您的代码进行相对最小的更改,以第二种方式执行,我还将全局count更改为本地,因为它的格式很差。

int check(int j)
{
    int count = 0;
    for (int l = 0; l < 32; l++)
    {
        if (j & 1)
            count++;
        j >>= 1;
    }
    return count;
}

它仍有问题。

如果int不是32位怎么办?第32位怎么样? (好的,你可以写l < 32,也许这更符合你的代码,我不确定你真正想要的是什么)

为什么它甚至签约开始?

并且check并未详细说明此功能的实际功能,您可以将此功能命名为popcnthammingweightnumberOfSetBits或类似名称。我个人会使用不同的算法,但这取决于你。