* 位运算
主要是在一个字段里面存储多个开关。如:0表示策略开关,1福袋开关,2代表地域开关。
策略开就是 1<< 0。二进制就是001,关就是000,110等
福袋开就是1 << 1。二进制就是010,关就是000,101等
* date: 2017年4月18日 下午2:24:35 <br/> * * @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; }
}