位運算表示集合的整數
阿新 • • 發佈:2019-01-05
表達方式
將一個集合{0,1,2,3,……,n-1}的子集s用二進位制編碼可以編碼為如下整數
在這種編碼下,我們就可以用位運算來表示集合的一些運算,具體例子如下:
空集
只含有第i個元素的子集 {i} :
含有全部n個元素的集合 {0,1,2,…….,n-1}:
判斷第i個元素是否屬於集合s:if(s>>i&1);
向集合中加入第i個元素:
從集合中去除第i個元素:s&~(1<<i);
集合s和t的並集 : s | t;
集合s和t的交集 : s&t;
程式碼實現
下面介紹幾種列舉集合的方法,//*的內容表示自己的處理
1.列舉所有子集
for(int s=0;s<(1<<n);s++){
//*
}
2.列舉某個集合子集
int sub=sup;
do{
//*
sub=(sub-1)⊃
}while(sub!=sup);
int comb=(1<<k)-1;
3.列舉所有集合大小為k的子集
int comb=(1<<k)-1;
while(comb<(1<<n)){
//*
int x=comb&-comb,y=comb+x;
comb=((comb&-y)/(x>>1 ))|y;
}