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

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

作者: 兰亭序乱 | 来源:发表于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