起源:力扣(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;
};
办法二:位运算
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
};