常写常忘 - hammingWeight

算法刷题系列:
https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof/solution/mian-shi-ti-15-er-jin-zhi-zhong-1de-ge-shu-wei-yun/

方法一:逐位判断
判断 n最右一位是否为 1,根据结果计数。
将 n右移一位(本题要求把数字 n 看作无符号数,因此使用 无符号右移 操作)

/**
 * @param {number} n - a positive integer
 * @return {number}
 */
var hammingWeight = function(n) {
    let mask = 1;
    let count = 0;
    for(let i = 0; i<32; i++) {
        if((mask & n) != 0) {
            count++;
        }
        n >>= 1;
    }
    return count;
};

方法二:巧用 n & (n - 1)
n&(n−1) 解析: 二进制数字 n 最右边的 1 变成 0 ,此 1 右边的 0 都变成 1 。

/**
 * @param {number} n - a positive integer
 * @return {number}
 */
var hammingWeight = function(n) {
    let count = 0;
    while(n!=0) {
        count++;
        n = n&(n-1);
    }
    return count;
};

(写了几次总是忘记,用的位操作符很不熟悉,需要反复练习)
关于按位操作符:https://www.jianshu.com/p/41fc061407ca

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。