1 <= n <= 20
1) 要求集合中不能有两个相邻的元素
if ((mask >> 1) & mask) continue;
2) 在限定必须不取某些元素的前提下枚举子集
// mask的第x位为0表示x必须不在子集中(原集合中不含这个元素):
for (int mask1 = mask; mask1 >= 0; mask1 = (mask1 - 1) & mask)
3) 在限定必须取某些元素的前提下枚举子集
// mask的第x位为1表示x必须在子集中:
for (int mask1 = mask; mask1 < (1 << m); mask1 = (mask1 + 1) | mask)
4) 找出二进制中恰好含有 k个1的所有数
for (int mask = 0; mask < 1 << n; ) {
int tmp = mask & -mask;
mask = (mask + tmp) | (((mask ^ (mask + tmp)) >> 2) / tmp);
}