输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
方法1: 最佳方法 通过数学发现 (n-1)&n这个运算只会使数中1的个数减少一个。
class Solution {
public:
int NumberOf1(int n) {
if(n == 0)
return 0;
int count = 0;
while(n){
n = (n-1)&n;
count++;
}
return count;
}
};
方法2:设置一个标志位并每次与当前数,将标志位一直左移完成基于32位长的遍历(以防最左端是负数标志位),不管是啥数都要循环32次,不是很友好
class Solution {
public:
int NumberOf1(int n) {
if(n == 0)
return 0;
int flag = 1;
int count = 0;
while(flag){
if( n & flag)
count++;
flag = flag << 1;
}
return count;
}
};