题解 | #二进制中1的个数#
二进制中1的个数
http://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb10b8
对于非负数,其补码就是其源码,若其为偶数则最右边一位为0,若其为基数则最右边一位为1,每次判断其奇偶性,并更改1的个数,然后将数字右移一位,直到数字为0。
对于负数,其补码为原码取反再加一,不好直接通过奇偶性统计1的个数,要先模拟该数变为补码的操作,所以先将其取绝对值,再转换为无符号类型unsigned,在对unsigned进行变为补码的操作,即取反再加一即可。
class Solution {
public:
int NumberOf1(int n) {
else if(n >= 0){
int count = 0;
while(n){
if(n%2){
count++;
}
n = n >> 1;
}
return count;
}
else{
n = abs(n);
unsigned num = ~n;
num++;
int count = 0;
while(num){
if(num%2){
count++;
}
num = num >> 1;
}
return count;
}
}
};