位运算表示集合的整数

来源:互联网 发布:淘宝缴纳保证金流程 编辑:程序博客网 时间:2024/05/16 07:42

    • 表达方式
    • 代码实现

表达方式

将一个集合{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;}
原创粉丝点击