判断一个数字由哪些不重复的二的幂值组成

2020-07-21  本文已影响0人  兰亭序乱

2020/7/20 js 原创


前几天工作的时候出现了这样一个需求:

1.已知有角色ABCD四个,分别用1 2 4 8 来代替(算是id吧,至于为什么是2的幂值,思考一下?)
2.后台返回一个数字(单个或者任意id相加的值),通过这个数字来判断某个角色是否在里面
3.比如后台返回一个10,可知只能是2+8,所以BD两个角色在里面

好,开始实现,我想了一下有两种方法可以做到:
    //返回组成传参的二的幂值数组
    getRoleArr:function(x){
        x = parseInt(x).toString(2).split("").reverse();//转成二进制再变成数组翻转
        let arr = [];
        x.forEach((v,i) => {
            if(v == '1') arr.push(2**i);
        });
        console.log(arr);
        return arr;           
    }

开始调用:
getRoleArr( 7 );//输出:[ 1, 2, 4 ]
getRoleArr( 30 );//输出:[ 2, 4, 8, 16 ]
getRoleArr( 16);//输出:[ 16 ]
getRoleArr( 10 );//输出:[ 2, 8 ]

ok,很完美( 自以为 (o゚▽゚)o ),但其实这个函数在高手眼中其实就是渣渣的,调用了辣么多内置方法,你是在演示如何去消耗性能的吗?然后我去看了别人如何写的 此处跳转
function GetBits(value) {
  var b = 1;
  var res = [];
  while (b <= value) {
    if (b & value) res.push(b);
    b <<= 1;
  }
  return res;
}

console.log(GetBits(129)); //[1,128] 
console.log(GetBits(77)); // [1,4,8,64] 
console.log(GetBits(255));
好吧,位运算都出来了,不过我不太服气哦,数据量一大的话他这个循环应该是要比我多循环几次的,具体耗时就不清楚了,有兴趣的同学可以测一下

嗯,今天就先到这里,拜拜~
上一篇 下一篇

猜你喜欢

热点阅读