二进制开关标记算法

// 二进制开关标记算法
// 原理 00001010 = 2^1 + 2^3 = 10  表示1号和3号是开,其余是关
// 例如 星期1和星期3 闹钟才提醒 加密就得到10  ,解码就得到 1和3 


// 用二进制标记当前是否显示;1表示显示,0表示不显示
// 例如: 标记的星期一至星期日那几天有闹钟提醒
// 传入 8 得到 3 表示星期3才提醒
// 传入 10 得到 3 1 表示星期1 和星期3 才提醒
static void MarkByBinary(int num) {
	int mi = num;
	while (num >= 1) {
		mi = (int) (Math.log(num) / Math.log(2));
		num = (int) (num - Math.pow(2, mi));
		System.out.println(mi);//输出
	}
}


//---------------------完整算法演示-------------------//

	public static void main(String[] args) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		list = MarkDecodeByBinary(11);
		int sum = MarkCodeByBinary(list);
		System.out.println();
		System.out.println(sum);
	}

	// 二进制开关标记算法_生成标记算法:
	// 用二进制标记当前是否显示;1表示显示,0表示不显示
	// 例如,标记的是星期一至星期日 那几天有闹钟提醒
	// 例如,传入3 1 得到 10
	static int MarkCodeByBinary(ArrayList<Integer> list) {
		int sum = 0;
		for (int i : list) {
			sum += (int) Math.pow(2, i);
		}
		return sum;
	}

	// 二进制开关标记算法_解码标记算法:
	// 用二进制标记当前是否显示;1表示显示,0表示不显示
	// 例如标记的是星期一至星期日 那几天有闹钟提醒
	// 例如,传入 8 得到 3 表示星期3才提醒
	// 例如,传入 10 得到 3 1 表示星期1 和星期3 才提醒
	static ArrayList<Integer> MarkDecodeByBinary(int num) {
		int mi = num;
		ArrayList<Integer> list = new ArrayList<Integer>();
		while (num >= 1) {
			mi = (int) (Math.log(num) / Math.log(2));
			num = (int) (num - Math.pow(2, mi));
			System.out.println(mi);// 输出
			list.add(mi);
		}
		return list;
	}


猜你喜欢

转载自zheyiw.iteye.com/blog/1745115