對於一個用位來表示的集合,我們可以枚舉其子集。設集合爲sup,枚舉的子集爲sub
按照遞增的順序枚舉的話,如果只是簡單的(sub+1)&sup的話,會出現前後沒有發生變化的問題。應該用下面的形式:
for(int sub = 0; sub != sup; sub = (sub - sup) & sup)
具體原因:應該是利用了補碼的不對稱性,但是我好想解釋不清楚。。。
按照遞減的順序枚舉的話 ,(sub-1)&sup可以自動的忽略0,再減去1,形式爲:
for(int sub = sup & (sup - 1);sub;sub = (sub-1) & sup)