LeetCode:位1的个数

274 阅读2分钟

来源:力扣(LeetCode)

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。

示例 1:

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

示例 2:

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

示例 3:

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

提示:输入必须是长度为 32 的 二进制串 。

题意很简单,就是计算一个二进制串中有多少个位为1

既然是二进制位,那我们也是使用位运算来解题

方法一:循环检查二进制位

位的左移操作:<<

例如:1 << 2 ,表示将1左移两位,即 0001 => 0100,即为4

console.log(1 << 2); // 4

console.log(1 << 5); // 32

还可以是其它位左移:

// 2左移, 0000 0010 => 0001 0000
console.log(2 << 3);  // 16

// 3左移,0000 0011 => 0001 1000
console.log(3 << 3); // 24

按位与:&

我们平时用最多估计就是逻辑与&&,所谓按位与就是二进制串:全1为1,有0则0

console.log(0001 & 0010);  // 0

console.log(0001 & 0011);  // 0001 => 1

下面来看题解:

var hammingWeight = function(n) {
    let sum = 0;
    // 已知二进制串为32位
    for (let i = 0; i < 32; i++) {
        // 利用位左移来判断n相应的位是否为1
        if (( n & (1<<i)) !== 0) {
            sum++
        }
    }
    return sum;
};

img

方法二:位运算

n & (n−1) 其运算结果总是把 n 的二进制位中的最低位的 1 变为 0 之后的结果

console.log(6 & (6 - 1));  // 5

6(0110)5(0101) => 6 & 5 = 0100

结果会把6的最低位的1变为0,我们可以计算6中有多少个1

let sum = 0
let n = 6
while (n) {
    // 按位与运算,只要n不等于0,说明n中还有1,一次消除一个1,sum就+1
    n = n & (n - 1)
    sum++
}
console.log(sum);

有了上面的栗子,下面题解就简单了:

var hammingWeight = function(n) {
    let sum = 0;
    while (n) {
        n &= n - 1;
        sum++
    }
    return sum
};

img