int NumberOf1(int n ) {
    // write code here
    int sum=0,m;     //sum用于记录1的个数,m用于记录正数情况下取余的结果
    if(n>0){           //正数比较简单,直接转换二进制数个数即可
        while(1){
            m=n%2;
            if(m==1) sum++;
            n=n/2;
            if(n==0) break;
        }
        return sum;
    }
    if(n<0){                      //原始方法求补码
        n=-1*n;                   //先变成正数
        int a[32];                    
        for(int i=31;i>=0;i--){          //用a数组记录n的正数的二进制数
            a[i]=n%2;
            n=n/2;
        }
        a[0]=1;                         //符号位取反
        for(int i=1;i<=31;i++){          //除符号位外各位0变1,1变0
            if(a[i]==0){
                a[i]=1;
                continue;
            }
            else{
                a[i]=0;
                continue;
            }
        }
        a[31]=a[31]+1;                 //整体+1
        for(int i=31;i>0;i--){              //考虑+1后的进位问题
            if(a[i]==2) a[i-1]=a[i-1]+1;
        }
        if(a[0]==2) a[0]=1;    //高位产生溢出时,符号位为1不变,应对-2147483648
        for(int i=0;i<32;i++){      //求1的个数
            if(a[i]==1) sum++;
        }
        return sum;
    }
    return 0;
}