【模板】二进制状态压缩

C++版本:

集合操作

空集∅ ——————————————————0

只含第i个元素的集合{ i } —————————1 << i

含有全部n个元素的集合{0,1…,n-1}———— ( 1 << n ) - 1

判断第i个元素是否属于集合S———————if ( S >> i & 1 )

向集合中加入第i个元素S∪{ i }—————— S | 1 << i

从集合中去除第i个元素S{ i } —————— S &~ ( 1<< i )

集合S和T的并集S∪T————————— S | T

集合S和T的交集S∩T—————————— S&T

将集合{0,1…,n-1}的所有子集枚举:

for (int S = 0; S < 1 << n; S++) {
	//对集合的操作 
}

枚举某个集合sup的子集:

int sub = sup;
do {
	//对子集的处理
	sub = (sub - 1)&sup;
} while (sub != sup)

枚举{0,1…,n-1}所包含的所有大小为k的子集:

int comb = (1 << k) - 1;
while (comb < 1 << n) {
	//进行针对组合的处理 
	int x = comb & -comb, y = comb + x;
	comb = ((comb&~y) / x >> 1) | y;
}

统计二进制中1的个数

int getsum(int S) { 
	int ans = 0;
	while (S) { if (S & 1)ans++; S >>= 1; }
	return ans;
}
posted @ 2020-09-13 20:34  pjhui  阅读(201)  评论(0编辑  收藏  举报