位运算
二进制
我们日常使用的是十进制,而计算机中则使用的是二进制
十进制:逢十进一
二进制:逢二进一
常用位运算
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)); } }