题目:
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解法一:就是让数字的每一位与1做位运算。
然后有一种做法把输入的的数字不断右移再和1做与运算来判断该位是否为1是错误的。
比如0x80000000,把其右移一位得到的是0xC0000000,不是0x40000000,因为在移位的时候会在高位补充符号位置。
所以应该把1来左移,然后再和原来的数做与运算。
比如判断1110(数字-6)的1的个数,首先1110 & 1 把1左移一位然后与运算
然后1110 & 10(即数字2)
然后1110 & 100
然后1110 & 1000
这样去判断1的个数
class Solution {
public:
int NumberOf1(int n) {
int ans = 0;
unsigned int opt = 1;
while(opt)//opt一直左移低位补零,当opt为0结束循环
{
if(n & opt)
ans++;//1的个数增加
opt<<=1;
}
return ans;
}
};
解法二:将一个整数减去1,再和原来整数做与运算,会把最右边的1变成0.有多少个1就可以这样操作多少次
class Solution {
public:
int NumberOf1(int n) {
int ans = 0;
while(n)
{
ans++;
n = (n -1) & n;
}
return ans;
}
};
来源:https://blog.csdn.net/qq_40722582/article/details/97389253