//?二進制開關標記算法??
//?原理?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?list?=new?ArrayList();??
list?=?MarkDecodeByBinary(11);??
int?sum?=?MarkCodeByBinary(list);??
????????System.out.println();??
????????System.out.println(sum);??
????}??
//?二進制開關標記算法_生成標記算法:??
//?用二進制標記當前是否顯示;1表示顯示,0表示不顯示??
//?例如,標記的是星期一至星期日?那幾天有鬧鐘提醒??
//?例如,傳入3?1?得到?10??
static?int?MarkCodeByBinary(ArrayList?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?MarkDecodeByBinary(int?num)?{??
int?mi?=?num;??
ArrayList?list?=new?ArrayList();??
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;??
????}??