两个运算规则
- 逻辑与,口诀,有0为0
- 逻辑或,口诀,有1为1
使用二进制存取多选信息,应用范围,如存取用户权限,功能权限,方向控制等.需要实现预期的结果,首先需要定权值,权值必须是$2^n$.然后通过逻辑或存储最终拥有的权限,用逻辑与判断是否拥有该权限
举列
定义操作权限
- 添加=2^0,二进制 0001
- 修改=2^1,二进制 0010
- 删除=2^2,二进制 0100
- 查询=2^3,二进制 1000
假设用户a拥有添加和删除权限 (a权限)=2^0 || 2^2=0001 || 0100=0101=5,所以a用户最终权值为5. 假设用户b拥有修改和查询权限 (b权限)=2^1 || 2^3=0010 || 1000=1010=10,所以b用户最终权值为10. 综上就可以在数据库中设计一个number列分别存储a和b的权值5,10;
在做权限判断时,需要要将权限值挨个同存储权限比较,结果值大于0表示拥有此权限 用户a存储值5,对应二进制 0101
- 添加 0001&0101 =0001=1 > 0 有权限
- 修改 0010&0101 =0000=0 = 0 无权限
- 删除 0100&0101 =0100=4 > 0 有权限
- 查询 1000&0101 =0000=0 = 0 无权限
用户b存储值10,对应二进制 1010,感兴趣可自行分析.对应(ts)代码
// author: herbert qq:464884492
// 1. 确权
enum Operation {
ADD = 1<<0,
EDIT = 1<<1,
DEL = 1<<2,
QUERY = 1<<3
}
// 2. 逻辑或,存储值
let a=Operation.ADD || Operation.DEL;
let b=Operation.DEL || Operation.QUERY;
// 3. 逻辑与,判断权限
if(Operation.ADD&a>0){
// do ADD
}
if(Operation.EDIT&a>0){
// do EDIT
}
if(Operation.DEL&a>0){
// do DEL
}
if(Operation.QUERY&a>0){
// do QUERY
}
从确权代码中,附送一个小知识点(移位操作符) 左移一位,相当于 x2.右移一位,相当于 /2.所以 2^0=1<<0 2^1=1<<1 2^2=1<<2 2^3=1<<3.不过,移位虽好,小心溢出哦.
知识虽小,重在积累.2020注定是不平凡的一年.加油!!
欢迎感兴趣的朋友关注我的订阅号“小院不小”,或点击下方二维码关注。我将多年开发中遇到的难点,以及一些有意思的功能,体会都会一一发布到我的订阅号中