题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路
在计算机系统中,数值一律用补码来表示和存储。
正数的补码就是其二进制表示,而负数的补码计算过程如下
假设用8位表示整数
则-5的补码的计算过程为:
- 先求5的二进制表示,为0000 0101
- 再把所有位取反:11111010
- 再加1,结果为11111011
在Java中,所有数据的表示方法都是以补码的形式表示
对于>>右移操作,正数最高位是0,右移最高位补0;负数最高位是1,右移最高位补1.
如-5,即11111011,如果操作-5>>1 结果为11111101
故不能将正数n右移逐位判断,因为如果是负数,则会无限循环。
可以使用无符号右移操作>>>
使用无符号右移时,无论正数负数,最高位都补0
则代码为
public class Solution {
public int NumberOf1(int n) {
int count=0;
while(n!=0){
count+=(n&1);//如果最低位是1,则和1相与结果为1
n=n>>>1;
}
return count;
}
}
值得一提的是,Java里的api能直接获取二进制补码,所以有
public class Solution {
public int NumberOf1(int n) {
char[] array=Integer.toBinaryString(n).toCharArray();
int count=0;
for(int i=0;i<array.length;i++){
if(array[i]=='1'){
count++;
}
}
return count;
}
}