题目描述
输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
解:
这道题没什么难度,主要是补码的使用。一般我们是先转正数原码,然后取反再加1。这里介绍一个比较方便的算法,即将正数原码扫描,遇到第一个1不操作,此后每一个数都取反(包括符号位,注意是从右往左)。当然,你也可以先把符号位设定好。
public class Solution {
public int NumberOf1(int n) {
int[] a=new int[32];
if(n>=0){
for(int i=31;i>=0;i--){
a[i]=n%2;
n/=2;
}
}else{
n=-n;
//先求原码
a[0]=1;
for(int i=31;i>0;i--){
a[i]=n%2;
n/=2;
}
//补码
boolean flag=false;
for(int i=31;i>0;i--){
if(flag){
a[i]=(a[i]+1)%2;
}else{
if(a[i]==1){
flag=true;
continue;
}else{
continue;
}
}
}
}
int shu=0;
for(int i=0;i<=31;i++){
if(a[i]==1)
shu++;
}
return shu;
}
}
--end--