/* 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;?
答案 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
并未详细说明此功能的实际功能,您可以将此功能命名为popcnt
或hammingweight
或numberOfSetBits
或类似名称。我个人会使用不同的算法,但这取决于你。