题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路:
0:返回0;
正数:就使用一个长度为32的数组(最高位默认为0)来记录其中出现1出现的次数
负数:补码生成的过程,首先最高位为1,其他位置取反,最末尾加1.
Note:
有计算机基础的都知道,java为四字节,那就是32位,integer的范围从-到
-1,那么Integer.MIN_VALUE是没法使用上面你的过程的,所以直接默认是1000 0000 0000 0000 返回1,具体过程自己可以上网百度。这里没出现,但是可以说一下,就是-0的补码是值得特别注意,有兴趣的可以自己推演一下。
public int NumberOf1(int n) {
if(n ==0)
return 0;
if(n ==Integer.MIN_VALUE)
return 1;
int num =0;
int[]tag =new int[32];
if(n>0){
for(int i=0;i<32;i++){
tag[i] =n%2;
n=n/2;
}
}else {
tag[31] =1;
n = 0-n;
for(int i=0;i<31;i++){
tag[i] =1-n%2;
n=n/2;
}
for(int i=0;i<31;i++){
if(tag[i] ==0){
tag[i]++;
break;
}else {
tag[i]--;
}
}
}
for(int i=0;i<32;i++){
if(tag[i] ==1)
num++;
}
return num;
}