[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;
    }
}
posted @ 2020-08-10 09:15  消灭猕猴桃  阅读(55)  评论(0编辑  收藏  举报