对于一个用位来表示的集合,我们可以枚举其子集。设集合为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)