最高效的就是方法三!
但是我们循序渐进进行求解。
方法一:
假设有一个整数为15 则其二进制就是 1111
如果 1111 对2取余为1则表示该位为1
此时我们就要去计算下一位,利用除2的思想,可以一位一位去计算,从而获得1的个数。
#include <stdio.h>
int count_bit_one(unsigned int n)
{
int count=0;
while(n)
{
if((n%2)==1)
{
count++;
}
n/=2;
}
return count;
}
int main()
{
int input=0;
printf("请输入一个整数>:");
scanf("%d",&input);
int count=count_bit_one(input);
printf("count = %d",count);
return 0;
}
利用整数 除2模2的特性,进行计算,这里需要注意的地方时 函数的入口参数为 无符号整形,是为了方便计算负数二进制中1
的个数。
方法二:
假设有一个整数为 15 其二进制就是 1111 则
#include <stdio.h>
int count_bit_two(int n)
{
int count=0;
int i=0;
for(i=0;i<32;i++)
{
if(((n>>i)&1)==1)
{
count++;
}
}
return count;
}
int main()
{
int input=0;
printf("请输入一个整数>:");
scanf("%d",&input);
int count=count_bit_two(input);
printf("count = %d \n",count);
return 0;
}
方法2较方法1有了明显的改善,但仍不是最优解。
方法三:
假设有一个整数为 15 其二进制序列为 1111
则 n=n&(n-1) --> 1111&1110–>1110
不难发现每当n&(n-1) n就会少一个1 因此
#include <stdio.h>
int count_bit_three(int n)
{
int count=0;
while(n)
{
n=n&(n-1);
count++;
}
return count;
}
int main()
{
int input=0;
printf("请输入一个整数>:");
scanf("%d",&input);
int count=count_bit_three(input);
printf("count = %d\n",count);
return 0;
}
方法3就相比于前两种更加高效! 方法2最少循环32次,而方法3则是有几个1 就循环几次,因此方法3是最高效的代码!