/********************
2. 对于一个正整数,用二进制表示,求其中1的个数
*/
#include<stdio.h>
//递归输出n的二进制形式
void binPrint(unsigned int n)
{
if(!n) return;
int tmp = n&0x01;
n >>=1;
binPrint(n);
printf("%d",tmp);
}
//循环移位,统计1的个数,O(log n)
int count1(unsigned int n)
{
int num = 0;
while(n)
{
if(n&0x01) num++;
n>>=1;
}
return num;
}
//如果一个数n为2的整数次幂,则 n&(n-1)=0;
//受这个启发,我们可以让每一次消灭最低位的1
//则每次消灭一个1(低位到高位), 复杂度O(m), m为v中1的个数
int count2(unsigned int n)
{
int num = 0;
while(n)
{
n &= (n-1);
num++;
}
return num;
}
int main()
{
int n;
printf("请输入一个正整数:");
scanf("%d",&n);
printf("%d的二进制表示为:",n);
binPrint(n);
printf("\n");
printf("方法1统计为: %d\n方法2统计为: %d\n", count1(n), count2(n));
return 0;
}
====================================
运行结果:
请输入一个正整数:1000
1000的二进制表示为:1111101000
方法1统计为: 6
方法2统计为: 6
Press any key to continue
//如果输入的是一个负数,则不能用将数字左移的方法
//而要用将1右移的方法的统计
int count3(int n)
{
int flag = 1;
int num = 0;
for(int i = 0 ; i < sizeof(n)*8; i ++)
{
if(n&flag) num++;
flag <<= 1;
}
return num;
}
==============================================
运行结果:
请输入一个正整数:-100
-100的二进制表示为:11111111111111111111111110011100
方法1统计为: 28
方法2统计为: 28
方法3统计为: 28
Press any key to continue