题目
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
题目解析
常规解法
为了避免死循环,我们可以不右移输入的数字n。首先把n和1做与运算,判断n的最低位是不是为1.接着把1左移一位得到2,再和n做与运算,就能判断n的次低位是不是1…..这样反复左移,每次都能判断n的其中一位是不是1。基于这种思路,我们可以把代码修改如下:
class Solution {
public:
int NumberOf1(int n) {
int count = 0;
unsigned int flag = 1;
while (flag) {
if (n & flag) {
count++;
}
flag = flag << 1;
}
return count;
}
};
能给面试官带来惊喜的解法
把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成 0。那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。基于这种思路,我们可以写出新的代码:
class Solution {
public:
int NumberOf1(int n) {
int count = 0;
while (n) {
count ++;
n = (n-1) & n;
}
return count;
}
};