基于位运算的组合权限认证(以dom为例)

总结一下位运算在组合权限认证的运用,首先简单介绍一下位运算,计算机中的数说到底都是以二进制形式存储,位运算就是对这些二进制数据做运算。由于是直接对二进制进行计算,所以运行效率是很高的。下面对位运算进行了总结:

  • &    与        二者都为1时,结果为1        =>        0001 & 0011 = 0001
  •  |     或        二者都为0时,结果为0        =>        0001 & 0011 = 0011
  •  ^   异或     二者相同为0,不同为1         =>        0001^ 0011 = 0010
  • ~    取反     0变成1,1变成0
  • <<   左移    整体左移,高位丢弃,低位补0    =>   0001 << 1 = 0010
  • >>   右移    整体右移,无符号数,高位补0,有符号数,右移补1 =>   0100 >> 2 = 0001

补充:

异或运算

1 任何数和自己做异或运算,结果为0

2 任何数和0做异或运算,结果为自己

3 异或运算满足结合律和交换律

判断一个数是否为奇数:(n & 1) != 0 结果为true就是奇数

整除2: n >> 1

下面用代码介绍在前端组合权限认证中的应用

// 组合权限认证,举个dom的例子
// 一个虚拟dom可能很多属性是动态的,每一个状态标记一个二进制位

let STYLE = 1   // 0001
let CLASS = 1 << 1  // 0010
let CHILDREN = 1 << 2   // 0100

// 授权 该节点的STYLE 和 CLASS 是动态的
// | 或 两个位都为0时,结果才为0
let vnodeType = STYLE | CLASS   // 0011

// 鉴权 
// & 与 两个位都为1时,结果才为1。
console.log('vnodeType的类型 STYLE  ' + (vnodeType & STYLE));
console.log('vnodeType的类型 CLASS  ' + (vnodeType & CLASS));
console.log('vnodeType的类型 CHILDREN  ' + (vnodeType & CHILDREN));

console.log('-----------------------------------------');
// 删除授权
// ^ 异或 两个位相同为0,不同为1
vnodeType = vnodeType ^ CLASS   // 0001
console.log('vnodeType的类型 STYLE  ' + (vnodeType & STYLE));
console.log('vnodeType的类型 CLASS  ' + (vnodeType & CLASS));
console.log('vnodeType的类型 CHILDREN  ' + (vnodeType & CHILDREN));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值