函数传参过程中,往往需要传入多种状态,若每个状态都添加一个参数,就会显得函数过于臃肿,不够优雅。
在二进制表示的数中,每个位都能表示一个状态,因此可以通过一个二进制数来存储状态。
代码如下:
numA、numB、numC、numD表示各种状态,可以枚举值代替,但必须为2的幂
status用于保存状态
private static int numA = 1;
private static int numB = 2;
private static int numC = 4;
private static int numD = 8;
private static int status;
设置状态,传值可用“|”运算符,如numA|numB的结果为3
public static void setStatus(int status) {
TestStatus.status = status;
}
获取状态:
使用与运算符来获取标志,如5的二进制为101,numC的值为4,二进制为100,相与的结果为100,因此含有numC的状态
//判断是否含有某个状态
public static void isContainsNum(int num, int subNum) {
if ((num & subNum) == subNum) {
System.out.println(num + " contains " + subNum);
}
}
public static int getStatus() {
isContainsNum(status, numA);
isContainsNum(status, numB);
isContainsNum(status, numC);
isContainsNum(status, numD);
return status;
}
测试如下:
public static void main(String[] args) {
setStatus(numA | numC);
getStatus();
}
//运行结果
5 contains 1
5 contains 4