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