二进制中1的个数
思路
之前想的是个笨办法,怎么把数字转化成二进制的形式,然后再统计1个个数。
后来发现,要巧用 “&”, 无需转换成二进制!!!
方法1 按位循环&
有一个性质,整数n&1的结果
- 0,n最右边的一位是0
- 1,n最右边的一位是1
&操作完,n右移1位,循环此操作,直至n为0.
话不多说,上代码
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int count=0;
while(n!=0){
count+=n&1;
n>>>=1;
}
return count;
}
}
方法2:巧用n&(n-1)
n-1与n在二进制形式中的差别是,别的位不变,最右边的1变成0
所以,n&(n-1)操作一次,便是把n最右边的1变成0。此操作仅对二进制位中的1有效,故操作的次数,即二进制形式中1的个数。循环次数比上一种方法少,故,效果更优
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int count=0;
while(n!=0){
count++;
n&=n-1;
}
return count;
}
}