- 先求出一个数的二进制,然后在计算1的个数
- 用移位操作实现
方法1:一个数除以2的余数就是2进制的最高位,把这个数除以2的结果继续循环,直到除以2的结果为0.循环结束后数组中1的个数,就是结果。
实现代码
#include <stdio.h>
#include <stdlib.h>
int count_one_bits(unsigned int value)
{
// 返回 1的位数
int bin[32] = { 0 };
int i = 0;
int count = 0;
for ( i = 0;; i++)
{
bin[i] = value % 2;
if (bin[i] == 1)
count++;
value /= 2;
if (value == 0)
break;
}
return count;
}
int main()
{
unsigned int value;
scanf_s("%d", &value);
int count =count_one_bits(value);
printf("%d", count);
system("pause");
}
方法2:进行32次循环,把这个数&1,把结果加到计数器,把这个数右移一位,直到退出循环。
#include <stdio.h>
#include <stdlib.h>
int count_one_bits(unsigned int value)
{
int i = 0;
int count = 0;
for ( i = 0;i<32; i++)
{
count += value & 1;
value >>= 1;
}
return count;
}
int main()
{
unsigned int value;
scanf_s("%d", &value);
int count =count_one_bits(value);
printf("%d", count);
system("pause");
}
方法3:不断清除这个数的二进制表示中最右边的1,同时累加计数器,直至这个数为0,代码如下
#include <stdio.h>
#include <stdlib.h>
int count_one_bits(unsigned int value)
{
int count = 0;
for (count =0 ; value; count++)
{
value &= value - 1;
}
return count;
}
int main()
{
unsigned int value;
scanf_s("%d", &value);
int count = count_one_bits(value);
printf("%d", count);
system("pause");
}