位运算

二进制

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

十进制:逢十进一

 二进制:逢二进一 

 

常用位运算

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));
    }
}
原文地址:https://www.cnblogs.com/cangshublogs/p/10842744.html