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));
网友评论