状态压缩中的位运算
x&1 等价于x%2 用来判断奇偶
& | ^ 转化成二进制进行位运算
x>>n 右移 相当于二进制数末尾抹去n个数 也就是原数÷2^n
x<<n 左移 相当于二进制数在末尾加上n个0 也就是原数*2^n
求n的第k位数字: n >> k & 1
返回n的最后一位1:lowbit(n) = n & -n
x&(1<<k) 判断x的第k位(从右向左从低到高 最低位是第0位)是不是1 结果为1代表第k位是1 结果为0代表第k位是0
一个二进制数就代表一个集合 01代表选取与否
枚举某个集合各元素选取与否
for(int i=0;i<(1<<n);i++)// 此时枚举了二进制0000...000---1111...111 n为集合元素个数
判断某个元素选取与否
for(int j=0;j<n;j++){if(i&(1<<j)) ...} // 判断第j+1个元素是否选取