二進制妙用之多選

二進制妙用之多選

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註定是不平凡的一年.加油!!

歡迎感興趣的朋友關注我的訂閱號“小院不小”,或點擊下方二維碼關注。我將多年開發中遇到的難點,以及一些有意思的功能,體會都會一一發布到我的訂閱號中。

訂閱號

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