来源:力扣(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
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。