关于状态码中二进制计算操作的问题(&,^,|)

例如:有以下状态码需要进行操作
    public final static Long OP_BIND_PHONE = 1L << 0; // 用户绑定手机状态码    0001
	public final static Long OP_BIND_EMAIL = 1L << 1; // 用户绑定邮箱		 0010
	public final static Long OP_BASIC_INFO = 1L << 2;// 用户是否填写基本资料    0100
	public final static Long OP_REAL_AUTH = 1L << 3;// 用户是否实名认证        1000

用户绑定手机状态码的状态为1(0001),用户绑定邮箱的状态为2(0010),则既有用户绑定手机状态码和用户绑定邮箱的状态为3(0011)

----------------------------------------------------->>>

判断是否有某个状态值,用&判断

以上面为例,0011&0010

  

//      0011
	//& 0010
	//-------------
	//  0010  》0,所以说明0011具有用户绑定邮箱的状态     
	
	/**
	 * @param states
	 *            所有状态值
	 * @param value
	 *            需要判断状态值
	 * @return 是否存在
	 */
	public static boolean hasState(long states, long value) {
		//如果结果>0,说明具有该状态;如果结果=0,没有该状态
		return (states & value) != 0;
	}


添加某个状态值( | )

//      0001
	//| 0010		有一个为true,结果即为true
	//-------------
	//  0011      

	/**
	 * @param states
	 *            已有状态值
	 * @param value
	 *            需要添加状态值
	 * @return 新的状态值
	 */
	public static long addState(long states, long value) {
		if (hasState(states, value)) {
			return states;
		}
		return (states | value);
	}

移除某个状态 ( ^异或 )

//      0011
	//^ 0010		不同为true,相同为false
	//-------------
	//  0001		移除用户绑定邮箱的状态码,剩下用户绑定手机的状态码
	/**
	 * @param states
	 *            已有状态值
	 * @param value
	 *            需要删除状态值
	 * @return 新的状态值
	 */
	public static long removeState(long states, long value) {
		if (!hasState(states, value)) {
			return states;
		}
		return states ^ value;
	}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值