二进制中1的个数(简单) yinshibanxian

一、题目描述

请实现一个函数,输入一个整数(无符号),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,

有 2 位是 1。因此,如果输入 9,则该函数输出 2。

示例1

输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。

示例2

输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。

示例3

输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。

二、题目解析

  1. 求出整数的二进制数,计算其中1的个数

     /**
     * @param {number} n - a positive integer
     * @return {number}
     */
     var hammingWeight = function(n) {
         let nums = 0;
         let temp = n; // 商
         let ret = n; // 余数
         let result = []; // 保存转换为二进制结果的数组
         while(temp > 0) {
             ret = temp % 2;
             temp = Math.floor(temp / 2);
             result.unshift(ret);
         }
         return result.filter(num => num === 1).length;
     };
    
  2. 循环右移至n为0

    注意,这里>>>是无符号右移,右边的位直接去掉,左边补0

     /**
     * @param {number} n - a positive integer
     * @return {number}
     */
     var hammingWeight = function(n) {
         let res = 0;
         while(n) {
             res += n & 1;
             n >>>= 1;
         }
         return res;
     };
    
  3. 巧用n & (n-1)

    • n - 1: 二进制数字 n 最右边的 1 变成 0,此 1 右边的 0 都变成 1
    • n & (n-1): 二进制数字 n 最右边的 1 变成 0 ,其余不变

    也就是说, n & (n-1)这样的运算能进行多少次,意味着n当中包含多少个1

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

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof