第一种方法,模2除2法。一个二进制序列通过模2运算,可以求得它的最末位数字,通过除2运算,可以去掉最末位的数,如此循环,如果模2的结果是1,那么给计数器加1,最后输出计数器的值,即出现1的个数。但这种方法只能求一个正数二进制序列出现1的次数,因为如果是负数模2的结果会永远都是0,而count也就永远都是0。具体实现代码如下:#define _CRT_SECURE_NO_WARNINGS 1
#include
#includeint count_one_bits(unsigned int n)
{
int count = 0;
while (n)
{
if (n % 2 == 1) //n%2求得二进制序列末位上面的数,如果等于1则count+1
{
count++;
}
n = n / 2; //n/2去掉二进制最末位的数
}
return count; //返回count的值。 函数返回值为int时必须有返回值
}
int main()
{
int num = 0;
printf("请输入一个数:");
scanf("%d", &num);
int ret = count_one_bits(num);//将实参num传入函数的形参中
printf("%d
", ret);
system("pause");
return 0;
}
第二种方法,将这个数与1按位与,如果最末位的数是1的话,那么按位与的结果为1,如此循环32次,每次当按位与的结果为1时,给计数器加1,然后进行右移运算,判断倒数第二位与1相与是否为1,最后输出计数器的值,即出现1的个数。具体实现代码如下:#define _CRT_SECURE_NO_WARNINGS 1
#include
#includeint count_one_bits(unsigned int n)
{
int i = 0;
int count = 0;
for (i = 0; i < 32; i++)
{
if (((n >> i) & 1) == 1) //一个数与1相与如果这个数的二进制序列最末位为1则相与的结果为1
{
count++;
}
}
return count;
}
int main()
{
int num = 0;
printf("请输入一个数:");
scanf("%d", &num);
int ret = count_one_bits(num);//将实参num传入函数
printf("%d
", ret);
system("pause");
return 0;
}
第三种方法, 将这个数与这个数减1的值按位与, 然后将结果赋给这个数,如此循环。 具体实现代码如下:#define _CRT_SECURE_NO_WARNINGS 1
#include
#includeint count_one_bits(unsigned int n)
{
int count = 0;
while (n)
{
n = n & (n - 1);
count++;
}
return count;
}
int main()
{
int num = 0;
printf("请输入一个数:");
scanf("%d", &num);
int ret = count_one_bits(num);//将实参num的值传递入函数
printf("%d
", ret);
system("pause");
return 0;
}