输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
//很多二进制问题都可以从下面的思路入手:
一个数减去1之后再与原来的数做位与运算,得到的结果相当于去除掉该数二进制表示中最右边的1
例如:用一条语句判断一个整数是不是2的整数次幂
n&(n-1)==0?‘2的整数次幂’:“不是2的整数次幂”;//道理就是二进制位中只有一个1,去掉这个1之后这个数变成0了
再例如:输入两个整数m,n,判断需要改变m的二进制位表示中的多少位才能得到n
step1:m^n//异或:无进位相加(相同为0,不同为1) //找到不同的位数
step2:使用下面函数:统计二进制中1的个数即可得到要改变的位数
class Solution {
public:
int NumberOf1(int n) {//这种方法只计算为1的位数,没有无效重复计算
int count=0;
while(n){//一个不为0的数肯定有一位为1
++count;//
n=(n-1)&n;//一个数减去1之后再与原来的数做位与运算,得到的结果相当于去除掉该数二进制表示中最右边的1
}
return count;
}
};
方法二:常规解法
class Solution {
public:
int NumberOf1(int n)
{
int count=0;
unsigned flag=1;
while(flag){//循环32次,因为整数位数是32(会存在大量无效的循环)
if(n&flag){//对应位数为1,则计数加1
count++;
}
flag<<=1;//对应位数置为1
}
return count; }
};