二进制妙用之多选

二进制妙用之多选

1. 基础知识

两个运算规则

  • 逻辑与,口诀,有00
  • 逻辑或,口诀,有11

使用二进制存取多选信息,应用范围,如存取用户权限,功能权限,方向控制等.需要实现预期的结果,首先需要定权值,权值必须是$2^n$.然后通过逻辑或存储最终拥有的权限,用逻辑与判断是否拥有该权限

举列

2. 确权

定义操作权限

  • 添加=2^0,二进制 0001
  • 修改=2^1,二进制 0010
  • 删除=2^2,二进制 0100
  • 查询=2^3,二进制 1000

3. 逻辑或运算存储权限

假设用户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;

4. 逻辑与权限判断

在做权限判断时,需要要将权限值挨个同存储权限比较,结果值大于0表示拥有此权限
用户a存储值5,对应二进制 0101

  • 添加 0001&0101 =0001=1 > 0 有权限
  • 修改 0010&0101 =0000=0 = 0 无权限
  • 删除 0100&0101 =0100=4 > 0 有权限
  • 查询 1000&0101 =0000=0 = 0 无权限

5. 实例代码

用户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.不过,移位虽好,小心溢出哦.

6. 总结

知识虽小,重在积累.2020注定是不平凡的一年.加油!!

欢迎感兴趣的朋友关注我的订阅号“小院不小”,或点击下方二维码关注。我将多年开发中遇到的难点,以及一些有意思的功能,体会都会一一发布到我的订阅号中。

订阅号

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章