例如:有以下状态码需要进行操作
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;
}