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