方法一:
利用位运算,先定义一个计数器count,让value的二进制的每一位与1进行按位与,若与的结果是1,则
count++,value右移,高位补0,若与的结果为0,只需将value右移移位,一直重复该步骤,直到value的
每一位都与1进行按位运算
用题中所给的例子来演示:
32位平台下一个整型占4个字节
代码:
int count_one_bits(unsigned int value)
{
int flag = 1;
int count = 0;
for (int i = 1; i < 32; i++){
if ((value & flag) == 1){
count++;
value>>= 1;
}
else{
value >>= 1;
}
}
return count;
}
int main()
{
int n = 0;
printf("请输入一个正数:\n");
scanf("%d", &n);
int ret=count_one_bits(n);
printf("该数二进制数中1的个数为:%d\n", ret);
system("pause");
return 0;
}
运行结果:
方法二:方法一的变种,其实在方法一中,value不断右移的过程就是二进制数计算中不断除2的过程,
类比十进制数求模运算,二进制的求模运算余数为1,则该位的数值为1。
代码:
nt count_one_bits(unsigned int value)
{
int flag = 1;
int count = 0;
while (value){
if ((value % 2) == 1){
count++;
value /= 2;
}
else{
value /= 2;
}
}
return count;
}
int main()
{
int n = 0;
printf("请输入一个正数:\n");
scanf("%d", &n);
int ret=count_one_bits(n);
printf("该数二进制数中1的个数为:%d\n", ret);
system("pause");
return 0;
}
运行结果: