• 二进制妙用之多选


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

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

    订阅号

  • 相关阅读:
    zoj 1239 Hanoi Tower Troubles Again!
    zoj 1221 Risk
    uva 10192 Vacation
    uva 10066 The Twin Towers
    uva 531 Compromise
    uva 103 Stacking Boxes
    稳定婚姻模型
    Ants UVA
    Golden Tiger Claw UVA
    关于upper、lower bound 的探讨
  • 原文地址:https://www.cnblogs.com/yfrs/p/binMult.html
Copyright © 2020-2023  润新知