来自李煜东《算法竞赛进阶指南》
//取出整数n在二进制表示下的第k位
(n>>k)&1
//取出整数n在二进制表示下的第0~k-1位
n&((1<<k)-1)
//把整数n在二进制表示下的第k位取反
n^(1<<k)
//对整数n在二进制表示下的第k位赋值1
n|(1<<k)
//对整数n在二进制表示下的第k为赋值0
n&(~(1<<k))
//lowbit(n),即整数n在二进制表示下最低位的1及其后面所有的0构成的数值
lowbit(n)=n&(-n)
关于状压DP枚举子集的方法与理解,大佬博客讲解很清晰
for(int s1=s;s1;s1=s&(s1-1))
{
int s2=s^s1;
//其中s1为子集,s2为s1在s内的补集
}