题目:
求一个数的二进制表示形式中的1的个数。
思路:
1、用1,从n的后面往前依次与n相与即可
2、把一个数-1的结果就是把它的二进制形式的最后一个1去掉,而后面的全变成1,如1111 1100 - 1 = 1111 1011
然后二者相与,得到的结果相比于原来的数就减少1个1,直到结果为0。即 1111 1100 & 1111 1011 = 1111 1000 。
代码:
#include <iostream>
using namespace std;
//五种位运算:& | ^ << >>
//左移运算<< :右边补0
//右移运算>> :如果是正数,左边补0 ,如果是负数,左边补1
//0000 1010 >> 2 : 0000 0010
//1000 1010 >> 3 : 1111 0001
//功能:求出一个整数的二进制形式的1的个数
//解法1:用1,从n的后面往前依次与n相与即可
int NumberOf1(int n)
{
if(n == 0)
return 0;
int num = 0;
int flag = 1;
while(flag)
{
if( n & flag)
num++;
flag = flag << 1;//flag移位
}
return num;
}
//解法2:把一个数-1的结果就是把它的二进制形式的最后一个1去掉,而后面的全变成1,如1111 1100 - 1 = 1111 1011
//1111 1100 & 1111 1011 = 1111 1000
int NumberOf1HHT(int n)
{
int num = 0;
while(n)
{
++num;
n = (n - 1) & n;
}
return num;
}
//应用1:判断一个数是不是2的整数次方 , 比如0000 1000 ,可先-1,再与,结果如果为0,则是2的整数次方
//应用2:输入两个整数m和n,判断需要改变m的二进制表示中的多少位才能得到n。方法:先异或m ^ n,在求结果的1的个数
//如1010 1101 , 异或后0111,结果为3
int main()
{
int n ;
while(cin>>n)
{
cout<<NumberOf1(n)<<endl;
cout<<NumberOf1HHT(n)<<endl;
}
}