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;
}