应用内含有太多开关,故选择用二进制码表达开关状态,感谢color_wind的文章,根据自己的业务逻辑做了一些小的修改,但在使用过程中发现一些小问题,也已修改。
/**
*@className: BinarySwitchUtils
*@description:
*@author ZHANGKAIRUI
*@date 2017/10/19 15:22
*/
public class BinarySwitchUtils {
/**
* 获取当前index状态,[0,1];
*
* @param value 存储的开关数据int32
* @param index 开关索引
* @return 当前位置的值
*/
public static boolean getSwitch(int value, int index) {
return (value >> index & 1) == 1;
}
/**
* 处理后的存储数据 int32
*
* @param value 存储的开关数据int32
* @param index 开关索引
* @param set 开关状态
* @return 当前位置的值[0,1]
*/
public static int createSwitch(int value, int index, boolean set) {
if (set) {
value = 1 << index | value;
} else {
value = ~(1 << index) & value;
}
return value;
}
/**
* 组装二进制开关串
*
* @param switchArray
* @return
*/
public static String createSwitches(Integer[] switchArray) {
int data = 0;
StringBuilder binaryBuilder = new StringBuilder();
for (int i = 0; i < switchArray.length; i++) {
if (switchArray[i] != null) {
boolean sign = switchArray[i] == 0 ? false : true;
data = createSwitch(data, i, sign);
}
}
//补齐最后一位的0
String binaryStr = Integer.toBinaryString(data);
if (!StringUtils.isEmpty(binaryStr) && (binaryStr.length() != switchArray.length)) {
Integer indexOffset = switchArray.length - binaryStr.length();
if(indexOffset > 0){
for (int i = 0; i < indexOffset; i++) {
binaryBuilder.append("0");
}
}
}
//补齐有效二进制
binaryBuilder.append(binaryStr);
return binaryBuilder.toString();
}
}