二進制妙用之多選
1. 基礎知識
兩個運算規則
- 邏輯與,口訣,有0爲0
- 邏輯或,口訣,有1爲1
使用二進制存取多選信息,應用範圍,如存取用戶權限,功能權限,方向控制等.需要實現預期的結果,首先需要定權值,權值必須是$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註定是不平凡的一年.加油!!
歡迎感興趣的朋友關注我的訂閱號“小院不小”,或點擊下方二維碼關注。我將多年開發中遇到的難點,以及一些有意思的功能,體會都會一一發布到我的訂閱號中。