[leetCode]剑指 Offer 15. 二进制中1的个数
解法一
这题需要注意的是,如果n为负数则二进制第一位为符号位,所以如果把n向右移几位左边就会补几位1而不是0。因此应把n与1相“与”,将1向左移。
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int flag = 1;
int count = 0;
while(flag != 0){
if( 0 != (flag & n))
count++;
flag = flag << 1;
}
return count;
}
}
解法二
如果n的最后一位是1,则n减1后最后一位为0;如果n最后一位为0,则n减1后,n最右边的1变为0,其之后的0全变为1。比如n为12,其二进制为1100,
n-1为1011,将1100与1011做与运算得1000。这样就把n最右边1变为0,所以有几次这种操作就有几个1。
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int count = 0;
while(n != 0){
n = n & (n-1);
++count;
}
return count;
}
}