对于非负数,其补码就是其源码,若其为偶数则最右边一位为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;
         }
     }
};