JS求二进制中1的个数

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

  • 示例 1:
    输入:n = 11 (控制台输入 00000000000000000000000000001011)
    输出:3
    解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。
  • 示例 2:
    输入:n = 128 (控制台输入 00000000000000000000000010000000)
    输出:1
    解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 ‘1’。
  • 示例 3:
    输入:n = 4294967293 (控制台输入 11111111111111111111111111111101,部分语言中 n = -3)
    输出:31
    解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 ‘1’。
  • 提示:
    输入必须是长度为 32 的 二进制串 。

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

思路及解法
我们可以直接循环检查给定整数 n 的二进制位的每一位是否为 1。
具体代码中,当检查第 i 位时,我们可以让 n 与 2^i 进行与运算,当且仅当 n 的第 i位为 1 时,运算结果不为 0。

代码:

var hammingWeight = function(n) {
    
    
    let ret = 0;
    for (let i = 0; i < 32; i++) {
    
    
        if ((n & (1 << i)) !== 0) {
    
    
        // 使用1<<i;而不是使用n>>1,因为n>>1会遇到负数(反码)
		// 当然1<<i也会遇到负数,所以此处使用的是!=0而不是>0
            ret++;
        }
    }
    return ret;
};

注:
移位运算符移位运算符把位按指定的值向左或向右移动
<< 向左移动 而 >> 向右移动,超过的位将丢失,而空出的位则补0

如 0 1 0 0 0 0 1 1(十进制67) 向左移动两位67<<2将变成
0 0 0 0 1 1 0 0 (十进制12)当然如果你用java代码写,由于是32位,不会溢出,结果是268
向右移动两位67>>2则是
0 0 0 1 0 0 0 0(十进制16)

下面介绍一些具体的应用
前面提到2向前移动1位变成4 利用这个特性可以做乘法运算(在不考虑溢出和符号位的情况下)
2 << 1 =4
3 << 1 = 6
4 << 1 = 8
同理 >> 则可以做除法运算

方法二:除二余一法

解题思路
利用十进制转二进制的原理

代码:

var hammingWeight = function(n) {
    
    
    let cur = n
    let count = 0;
     while(cur>0){
    
    
         let temp = cur%2;
         count = temp==1 ? count +1 : count;
         cur = Math.floor(cur/2);
     }
     return count
};

猜你喜欢

转载自blog.csdn.net/qq_38970408/article/details/122259411