//二进制中1的个数
#include <iostream>
using namespace std;
//O(d),d为1的个数
int NumberOf1(int n)
{
int ret = 0;
while(n)
{
++ret;
n = n & (n-1);
}
return ret;
}
//O(sizeof(int)) int型数据需要32次
int NumberOf12(int n)
{
int ret = 0;
unsigned int flag = 1;
while(flag)
{
if(n & flag)
++ret;
flag = flag << 1;
}
return ret;
}
int main()
{
int n;
while(cin>>n)
{
cout<<NumberOf1(n)<<" "<<NumberOf12(n)<<endl;
}
return 0;
}
扩展问题1. 用一条语句判断一个整数是不是2的整数次方
if( ! ( n & (n-1) ) )
........
扩展问题2 两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n
int NumberOfDiff(int m,int n)
{
int ret = 0;
m = m ^ n;
while(m)
{
++ret;
m = m & (m - 1);
}
return ret;
}