位运算-集合的整数表示

比如一个集合(5,8,3,6,78,45,33,22),我们可以用一个n位的2进制数表示这个集合。

比如11111111代表这个全集,而10100000代表(5,3)这个子集(二进制中1代表这个子集中有全集中相应位置的数字)

像这样表示后,一些集合运算可以对应地写成如下方式:(全集按6个元素)

空集......................................................................0

只含有第i个元素的集合{i}.....................................1<<i   (1<<2=4(10进制)=000100(2进制),1<<4=010000)

只含有全部n个元素的集合{0,1,2,....n-1}...............(1<<n)-1  (1<<6=1000000     1<<6-1=0111111)

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

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

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

集合S和T的并集....................................................S|T

集合S和T的交集....................................................S&T

将集合{0,1,2,....n-1}所有子集枚举出来

for(s=0;s<1<<n;s++)

{//接下来的操作。

}

 

枚举某个集合(这个集合本身是别人的子集 比如0111000)的子集

t=s;//对s这个子集不断递减1,查询其子集

do

{

     t=(t-1)&t;

}while(t!=s)//处理完0之后,会有-1&s=s

 

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

comb=(1<<k)-1;

while(comb<1<<n)

{

x=comb&-comb,y=comb+x;

comb=((comb&~y)/x>>1)|y;//comb就是大小为k的子集

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值