• 位运算


    二进制

    我们日常使用的是十进制,而计算机中则使用的是二进制

    十进制:逢十进一

     二进制:逢二进一 

     

    常用位运算

    1) 位与 & (1&1=1 0&0=0 1&0=0)

    如果两个相应的二进制位都为1,则该位的结果值为1,否则为0

    2) 位或 |  (1|1=1 0|0=0 1|0=1)

    两个相应的二进制位中只要有一个为1,该位的结果值为1

    3) 位非 ~  (~1=0  ~0=1)

    ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1

    4) 位异或^  (1^1=0 1^0=1 0^0=0)

    若参加运算的两个二进制位值相同则为0,否则为1

    有符号右移 >> (若为正数,高位补0,负数,高位补1)

    有符号左移 <<(右补0)

    无符号右移 >>>(不论正负,高位均补0)

    特殊性质:取模 a%(2^n) 等价于a&(2^n -1), map里数组个数一定为2的乘方数,计算key值在哪个元素中的时候,就用位运算来快速定位。

    位运算应用场景

     Java中的类修饰符,成员变量修饰符,方法修饰符

    Java容器中的HashMap和ConcurrentHashMap的实现

    权限控制或者商品属性

    简单可逆加密(1^1=0;0^1=1)

     将位运算用在权限控制、商品属性上

    节省代码量,效率高,属性变动影响小,不直观

    public class Permission {
    
        private static final int ALLOW_SELECT = 1<<0;
        private static final int ALLOW_INSERT = 1<<1;
        private static final int ALLOW_UPDATE = 1<<2;
        private static final int ALLOW_DELETE = 1<<3;
    
        //当前的权限状态
        private int flag;
    
        public void setPermission(int permission){
            flag = permission;
        }
    
    
        /*增加权限,可以一项或者多项*/
        public void addPermission(int permission){
            flag = flag|permission;
        }
    
        /*删除权限,可以一项或者多项*/
        public void disablePermission(int permission){
            flag = flag&~permission;
        }
    
        /*是否拥有某些权限*/
        public boolean isAllow(int permission){
            return (flag&permission)==permission;
        }
    
        /*是否不拥有某些权限*/
        public boolean isNotAllow(int permission){
            return (flag&permission)==0;
        }
    
    
        public static void main(String[] args) {
            int flag = 15;
            Permission permission = new Permission();
            permission.setPermission(flag);
            permission.disablePermission(ALLOW_DELETE|ALLOW_INSERT);
            System.out.println("ALLOW_SELECT="+permission.isAllow(ALLOW_SELECT));
            System.out.println("ALLOW_INSERT="+permission.isAllow(ALLOW_INSERT));
            System.out.println("ALLOW_UPDATE="+permission.isAllow(ALLOW_UPDATE));
            System.out.println("ALLOW_DELETE="+permission.isAllow(ALLOW_DELETE));
        }
    }
  • 相关阅读:
    problem in Sourcetree
    Get started with Sourcetree
    IIS application pool access desktop denied
    结构型模式 适配器模式
    结构型模式 装饰模式
    结构型模式 代理模式
    创建型模式 原型模式
    创建型模式 建造者模式
    创建型模式 抽象工厂
    设计模式的六大原则
  • 原文地址:https://www.cnblogs.com/cangshublogs/p/10842744.html
Copyright © 2020-2023  润新知