题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路
- 常规思路:考虑十进制和二进制的转换,可以直接调用Java库函数Integer.toBinaryString,把整数转换成字符串形式的二进制(不用考虑正负的问题了)
- 巧妙利用位运算:整数进行位运算时,肯定是用二进制进行运算的,所以不用转换成二进制
(1)某个正数n=12=1100,n-1=11=1011
从n最右边开始出现第一个1的位置看,其相邻的数n-1就从这个位置开始和n每位都相反
n和n-1进行与运算:n&(n-1)=1000,可以看到n最右边的1没了
每进行一躺上述操作(直到最后全为0),就会少一个1,从而得出1的总数
(2)若n为负数,也同样适用,如n=-12=0100,n-1=-13=0011
n&(n-1)=0000,全是0,说明-12中只有一个1
实现
- Java库函数十进制转二进制Integer.toBinaryString
public int NumberOf1(int n) {
String s=Integer.toBinaryString(n);
int count=0;
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='1'){
count++;
}
}
return count;
}
2.巧用位运算
public int NumberOf1(int n) {
//比较巧妙的位运算
int count=0;
while(n!=0){
count++;
n=n&(n-1);
}
return count;
}