Java-二进制位运算符/位掩码(BitMask)的使用

##十进制二进制互转

  • 十进制转成二进制,一直除以2取余数(从下到上取),直到为0:
    5/2 …1
    2/2 …0
    1/2 …1
    即 5 = 101
  • 二进制转成十进制乘以2的幂数:
    1011 = 123+0*22+121+1*20 = 11;或者根据"1,2,4,8"直接求出来:8+0+2+1 = 11

位运算符

Java-二进制位运算符/位掩码(BitMask)的使用_第1张图片
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TpvyRtvr-1593313077192)(https://img-blog.csdn.net/20180104220733649?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTXJfWWFuZ1hpYW5mYV9f/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]

左移<<:乘以2的移动的位数次幂;

右移>>:除以2的移动位数次幂;

(直接对二进制进行运算,运算速度最快,但是有局限性,以2的倍数增减)

在Android中使用位运算可以表示不同的状态,不同的状态组合等

例如,在一个系统中,用户一般有查询(Select)、新增(Insert)、修改(Update)、删除(Delete)四种权限,四种权限有多种组合方式,也就是有16中不同的权限状态(2的4次方)。
一般情况下会想到用四个boolean类型变量来保存:

public class Permission {
	
	// 是否允许查询
	private boolean allowSelect;
	
	// 是否允许新增
	private boolean allowInsert;
	
	// 是否允许删除
	private boolean allowDelete;
	
	// 是否允许更新
	private boolean allowUpdate;

	// 省略Getter和Setter
}

下面是另外一种方式,使用位掩码的话,用一个二进制数即可,每一位来表示一种权限,0表示无权限,1表示有权限。


public class NewPermission {
	// 是否允许查询,二进制第1位,0表示否,1表示是
	public static final int ALLOW_SELECT = 1 << 0; // 0001
	
	// 是否允许新增,二进制第2位,0表示否,1表示是
	public static final int ALLOW_INSERT = 1 << 1; // 0010
	
	// 是否允许修改,二进制第3位,0表示否,1表示是
	public static final int ALLOW_UPDATE = 1 << 2; // 0100
	
	// 是否允许删除,二进制第4位,0表示否,1表示是
	public static final int ALLOW_DELETE = 1 << 3; // 1000
	
	// 存储目前的权限状态
	private int flag;

	/**
	 *  重新设置权限
	 */
	public void setPermission(int permission) {
		flag = permission;
	}

	/**
	 *  添加一项或多项权限
	 */
	public void enable(int permission) {
		flag |= permission;
	}
	
	/**
	 *  删除一项或多项权限
	 */
	public void disable(int permission) {
		flag &= ~permission;
	}
	
	/**
	 *  是否拥某些权限
	 */
	public boolean isAllow(int permission) {
		return (flag & permission) == permission;
	}
	
	/**
	 *  是否禁用了某些权限
	 */
	public boolean isNotAllow(int permission) {
		return (flag & permission) == 0;
	}
	
	/**
	 *  是否仅仅拥有某些权限
	 */
	public boolean isOnlyAllow(int permission) {
		return flag == permission;
	}
}

以上代码中,用四个常量表示了每个二进制位代码的权限项。
例如:
ALLOW_SELECT = 1 << 0 转成二进制就是0001,二进制第一位表示Select权限。
ALLOW_INSERT = 1 << 1 转成二进制就是0010,二进制第二位表示Insert权限。
private int flag存储了各种权限的启用和停用状态,相当于代替了Permission中的四个boolean类型的变量。
用flag的四个二进制位来表示四种权限的状态,每一位的0和1代表一项权限的启用和停用,下面列举了部分状态表示的权限:
flag 删除 修改 新增 查询
1(0001) 0 0 0 1 只允许查询(即等于ALLOW_SELECT)
2(0010) 0 0 1 0 只允许新增(即等于ALLOW_INSERT)
4(0100) 0 1 0 0 只允许修改(即等于ALLOW_UPDATE)
8(1000) 1 0 0 0 只允许删除(即等于ALLOW_DELETE)
3(0011) 0 0 1 1 只允许查询和新增
0 0 0 0 0 四项权限都不允许
15(1111) 1 1 1 1 四项权限都允许
使用位掩码的方式,只需要用一个大于或等于0且小于16的整数即可表示所有的16种权限的状态。

参考地址:
http://xxgblog.com/2013/09/15/java-bitmask/

你可能感兴趣的:(java笔记)