n个元素的集合的子集S,用数字f(S) = sum{2 ^ i | 0 <= i < n}
1.空集 0
2.只有第i个元素的集合 1 << i
3.含有全部n个元素的集合 (1 << n) - 1
4.判断第i个元素是否属于集合S if(S >> 1 & 1)
5.向集合S中加入第i个元素 S | 1 << i
6.从集合S中去除第i个元素 S & ~(1 << i)
7.集合S和T的并集 S | T
8.集合S和T的交集 S & T
9.求某个集合sup的子集(比如sup = 01101101)
int sub = sup;//从sup开始递减枚举
do{
sub = (sub - 1) & sup;
}while(sub != sup)//处理完0后,-1 & sup == sup
10.求全集的k个元素的子集
int comb = (1 << k ) - 1;
while(comb < (1 << n))
{
int x = comb & -comb,y = comb + x;
comb = ( (comb & ~y) / x >> 1) | y;
}
//懵逼,好难理解