方法1:除2取余法,主要缺点是只能计算正整数,对于负数不能计算(若输入一个负数,答案为0)。具体代码如下:

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int  count_one_bits(int value);
	int v;
	printf("请输入一个整数:");
	scanf("%d", &v);
	count_one_bits(v);
	system("pause");
	return 0;
}
int  count_one_bits(int value)
{
	int count = 0;
	int val = value;
	while (value != 0)
	{
		if (value % 2 == 1)
			count++;
		value = value / 2;
	}
	printf("\n%d的二进制中1的个数为%d\n", val, count);
	return count;
}

方法2:移位法,移位法有“右移”和“左移”,右移时负数补1、正数补0,而左移时正负数均补0.本代码程序中采用“右移法”。移位法的缺点是效率低下,比如对于-1而言,需要移位32次才能得到正确答案。具体代码如下:

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int  count_one_bits(int value);
	int v;
	printf("请输入一个整数:");
	scanf("%d", &v);
	count_one_bits(v);
	system("pause");
	return 0;
}
int  count_one_bits(int value)
{
	int count = 0;
	int val = value;
	int i = 32;
	while (i--)
	{
		if (value & 1 ==1)
			count++;
		value = value>>1;
	}
	printf("\n%d的二进制中1的个数为%d\n", val, count);
	return count;
}

方法3:按位“与”法,即x=x & (x-1),此算法效率高而且对于正负数均可。

比如15只需进行4次运算就能得到正确答案,15的8位二进制补码为00001111,下面为具体的过程:

                                         0000 1111

                                  减1    0000 1110

                                与运算   0000 1110  *****第一次******


                                  减1    0000 1101

                                与运算   0000 1100  *****第二次******


                                  减1    0000 1011

                                与运算   0000 1000  *****第三次******


                                  减1    0000 0111

                                与运算   0000 0000  *****第四次******

进行了四次运算,得出15的二进制数有4个1.具体代码如下:

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int  count_one_bits(int value);
	int v;
	printf("请输入一个整数:");
	scanf("%d", &v);
	count_one_bits(v);
	system("pause");
	return 0;
}
int  count_one_bits(int value)
{
	int count = 0;
	int val = value;
	while (value)
	{
		count++;
		value = value & (value-1);
	}
	printf("\n%d的二进制中1的个数为%d\n", val, count);
	return count;
}