题目:写一个函数输入一个整数,输出该二进制表示中1的个数
eg:输入9;9的二进制为:1001;输出为:2(2个1);
代码如下:
#include<stdio.h>
//1.前俩种常规解法
//2.除法的效率要比移位运算的效率低很多
//3.但如果是负数前俩种算法会出现死循环,则需要改变移位的目标,改为去改变flag;
//4.最后一种是最优的方法,此规律很难发现,思路如下:int count_one_bit4(int num);
//除法、模余
int count_one_bit(int num)
{
int count = 0;
while (num)
{
if (num % 2)
++count;
num /= 2;
}
return count;
}
//移位、按位与
int count_one_bit2(int num)
{
int count = 0;
while (num)
{
if (num & 1)
++count;
num >>= 1;
}
return count;
}
//避免死循环的解法(负数)
int count_one_bit3(int num)
{
int count = 0;
unsigned int flag = 1;
while (flag)
{
if (num & flag)
++count;
flag <<= 1;
}
return count;
}
//1.整数减1;(将从右到左的第一个1以及1右边的数做取反操作)
//2.减1的结果再与原整数相与;(将上述所说的1右边的数做置0操作)
//3.1个二进制中有几个1就可以做几次这样的操作;
int count_one_bit4(int num)
{
int count = 0;
while (num)
{
++count;
num &= (num - 1);
}
return count;
}
//测试如下:
int main()
{
printf("count_one_bit:%d\n", count_one_bit(9));
printf("count_one_bit2:%d\n", count_one_bit2(9));
printf("count_one_bit3:%d\n", count_one_bit3(9));
printf("count_one_bit4:%d\n", count_one_bit4(9));
return 0;
}