zoukankan      html  css  js  c++  java
  • 二进制妙用之多选

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

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

    订阅号

  • 相关阅读:
    RabbitMQ官方教程四 Routing(GOLANG语言实现)
    RabbitMQ官方教程三 Publish/Subscribe(GOLANG语言实现)
    RabbitMQ官方教程二 Work Queues(GOLANG语言实现)
    RabbitMQ官方教程一Hello World(GOLANG语言实现)
    etcd学习之安装与命令
    docker安装consul集群
    golang实现无限级菜单(beego框架下)
    beego框架(golang)学习过滤器(实现restful请求)
    beego框架(golang)学习验证码
    九 Android基本知识介绍
  • 原文地址:https://www.cnblogs.com/yfrs/p/binMult.html
Copyright © 2011-2022 走看看