需求:ABC三个按钮,分别有两种状态,计算任意按钮打开的所有状态
分析:很明显,这是个状态判断,用二进制为表示再合适不多;那么三位二进制,最大是7,我们只要遍历所有的数字是否包含这个开关就好了
二进制举例:A 是001,B是010,C是100 ,那么A打开的所有数字就是 001,011,101,111
OK,上代码
public class BinaryUtil {/*** 使用3bit表示3种房源端*/private static final int all_type = 3;private static final int AN_JU_KU = 1;private static final int SOU_FANG = 1<<1;private static final int BEI_KE = 1<<2;public static void main(String[] args) {long l = System.currentTimeMillis();System.out.println(calNums(all_type,SOU_FANG));System.out.println(calNums(all_type,AN_JU_KU));System.out.println(calNums(all_type,BEI_KE+SOU_FANG));System.out.println("cost:"+(System.currentTimeMillis()-l));}public static List<Integer> calNums(int allType,int flag){int max = max(allType);List<Integer> list = new ArrayList<>(max);for (int i = 1; i < max; i++) {if(check(i,flag)){list.add(i);}}return list;}/*** 计算指定位数的最大数字** @param i* @return*/public static int max(int i) {return (int) Math.pow(2, i);}/*** 是否包含某个数** @param source 原数字* @param flag 比对数字* @return*/public static boolean check(int source, int flag) {return (source & flag) == flag;}}