1. 程式人生 > >位運算表示集合的整數

位運算表示集合的整數

表達方式

將一個集合{0,1,2,3,……,n-1}的子集s用二進位制編碼可以編碼為如下整數

f(s)=is2i
在這種編碼下,我們就可以用位運算來表示集合的一些運算,具體例子如下:
空集 : 0;
只含有第i個元素的子集 {i} :1<<i;
含有全部n個元素的集合 {0,1,2,…….,n-1}:(1<<n)1;
判斷第i個元素是否屬於集合s:if(s>>i&1);
向集合中加入第i個元素:s|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)&sup;
}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; }