import java.util.List;
import cn.com.duiba.tuia.core.api.enums.AppFlowStrategySwitchEnum;
/**
* 位运算
主要是在一个字段里面存储多个开关。如:0表示策略开关,1福袋开关,2代表地域开关。
策略开就是 1<< 0。二进制就是001,关就是000,110等
福袋开就是1 << 1。二进制就是010,关就是000,101等
*
* @author chencheng
* @version
*/
public class SwitchesUtil {
//判断开关是否开
public static int switchChange(int switches,int bit){int v = 1 << bit;
int ret = switches & v;
return ret == 0 ? 0 : 1;
}
/**
* 所有开启此开关的值
*
* @param bit
* @return
*/
public static List<Integer> switchOpen(int bit){
List<Integer> list = new ArrayList<Integer>();
int all = AppFlowStrategySwitchEnum.values().length;
int max = (1<<all) -1;
int v = 1 << bit;
for (int i = 0; i <= max; i++) {
if ((i&v) > 0) {
list.add(i);
}
}
return list;
}
/**
* 所有关闭此开关的值
*
* @param bit
* @return
*/
public static List<Integer> switchClose(int bit){
List<Integer> list = new ArrayList<Integer>();
int all = AppFlowStrategySwitchEnum.values().length;
int max = (1<<all) -1;
int v = 1 << bit;
for (int i = 0; i <= max; i++) {
if ((i&v) == 0) {
list.add(i);
}
}
return list;
}
/**
* 开关置为开
*
* @param opType 开关值
*/
public void grantOpSwitches(int opType) {
int v = 1 << opType;
switches = switches | v;
}
/**
* 开关置为关
*
* @param opType 开关值
*/
public void ungrantOpSwitches(int opType) {
int v = 1 << opType;
v = ~v;
switches = switches & v;
}
/**
* 开关是否开
*
* @param opType
* @return
* @since JDK 1.6
*/
public boolean isOpSwitches(int opType) {
int v = 1 << opType;
int ret = switches & v;
return ret != 0;
}
}