统计二进制数中的1

avatar
Ctrl+C、V工程师 @豌豆公主

背景

这是一个风和日丽的早晨,群里突然开始了一轮的解题solo,这个题目在大家的发散下得到了不少简单的方案,和大家分享一下。

题目介绍

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

方案一

采用的是位运算,将二进制数向右挪一位 >>=,这个地方可以这么去理解

let a = 5;      // 对应的二进制数 => 00000000000000000000000000000101
                // 将a向右挪2位
a >>= 2;        // 00000000000000000000000000000001

通过上边的操作得到a == 1,所以同学a就是运用了这点,通过while不断的将二进制数向右挪动,每一次通过按位与运算&判断当前是否为1,并记录a的个数

var hammingWeight = function(n) {
    let count = 0;
    while(n){
        if(n&1) {
            count++;
        }
        n >>= 1;
    }
    return count;
};

方案二

采用的是字符串转数组的方式,在统计数组的长度即可计算,这里要注意的是:match方式获得的是一个迭代器,需要转换一下。

Array.from((15).toString(2).matchAll(/1/g), x => +x).length

这边主要就是先把数字转成字符串,然后通过正则匹配出数字1,再计算数组长度

方案三

这个方案我觉得更加简单,单纯通过字符串替换,然后直接通过length熟悉获得数量

(15).toString(2).replace(/0/g,'').length

总结

以上集中方案,包含了位运算,数组,字符串,不知道大家还可以怎么处理呢?