js通过位运算实现权限加解密

首先介绍一下js中的位运算:

1. "&" :与运算,转化为二进制数,如果相同位数都为1则得结果为1,否则为0; 

2. "|" :或运算,转化为二进制数,如果相同位数只要有一个为1则得结果为1,否则为0; 

3. "^" :异或运算,转化为二进制数,如果相同位数不同则得结果为1,否则为0; 

4."<<" 异位运算符,1<<1,表示将1左移一位,也就是010,在二进制中代表2;

顺便说一下,十进制数字互相转化。

十进制转为别的进制:

var num = 123;
console.log(num.toString(2))
console.log(num.toString(8))//参数传想要转化的位数

 别的进制转化为十进制:

var num = 110;
console.log(parseInt(num,2))//二进制转化为十进制

假设我们现在有5项权限,在二进制中用1代表拥有权限,0代表不拥有。所以11111这样代表拥有所有的五项权限,那么我们如何知道用户是否有某一项具体权限呢。

比如,我们现在想检测用户是否有第一项权限,我们首先用过异位 1 << 0,向左移0位,还是1,然后1 & (Math.pow(2,5) -1),

如果返回0,说明个位对不上,也就是说我们当前没有权限,如果返回1,说明我们拥有第一项权限,同理,如果需要检验第二位权限,只需要异位2就好了。

if((1 << 0) & (Math.pow(2,5) - 1) !== 0){
    //拥有第一项权限权限
}

if((1 << 1) & (Math.pow(2,5) - 1) !== 0){
    //拥有第二项权限权限
}

上面写的是大概原理,可能初次接触有点绕,下面我给大家举几个详细的例子说明:

首先需要说明的是 1 << 0,相当于,2的零次方,1<<1,结果是2的一次方,所以上面我用了,Math.pow()这个方法。我们现在来验证一下我们使用上述方法是否能准确的判断权限。

假设,我们拥有第三项权限,那么就是 1 << 2,也就是十进制的4,二进制的100,第三位为1,代表有权限,跟我们预想的一致。然后跟2的5次方减1进行与运算,也就是31,结果为4,为什么会得到4呢,因为与运算相同为1,不同为0,也就是结果为00100的二进制数,说明我们拥有第三项权限。

接下来介绍权限的计算,也就是说我有第一、三项权限,那么代表我权限的值是多少呢。

我们可以这样计算:

你拥有第一项,所以应该是1<<1,也就是1,拥有第三项权限,也就是1<<2,也就是4, 2 + 4 =5,5就是代表你权限的数字。

验证一下:

1 << 0
//1
1 & 5
//1  非0,说明拥有第一项权限

1 << 2
//4
4 & 5
//4  非0,说明拥有第三项权限

1 << 1
//2
2 & 5
//0 为0,说明没有第二项权限

好了,这篇到此结束,希望对大家有帮助。\(^o^)/~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值