美文网首页
判断一个数字由哪些不重复的二的幂值组成

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

作者: 兰亭序乱 | 来源:发表于2020-07-21 17:07 被阅读0次

2020/7/20 js 原创


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

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

好,开始实现,我想了一下有两种方法可以做到:
  • 第一种方法在js里直接可以用与运算来实现,a & b 就可以了。已知返回10,角色为B或D,两者与一下就可以了

    已知:
    10 & 2 = 2
    10 & 4 = 4
    10 & 3 = 2

    因为3不等于2,所以只要结果与较小的那个值相等该值就一定在里面

  • 第一种方法虽然简单但是扩展性不高,如果需求有变化呢,比如后台返回一个值直接让你判断都有哪些角色在里面,角色数量一多不可能一个一个去试,所以我就自己写了个简单的方法,如下:
    //返回组成传参的二的幂值数组
    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));
好吧,位运算都出来了,不过我不太服气哦,数据量一大的话他这个循环应该是要比我多循环几次的,具体耗时就不清楚了,有兴趣的同学可以测一下

嗯,今天就先到这里,拜拜~

相关文章

网友评论

      本文标题:判断一个数字由哪些不重复的二的幂值组成

      本文链接:https://www.haomeiwen.com/subject/brbikktx.html