位运算表示集合的整数

本文介绍了如何使用位运算来表示集合的子集,通过二进制编码将集合转化为整数。同时,提供了代码实现,包括枚举所有子集、特定集合的子集以及枚举大小为k的子集的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

表达方式

将一个集合{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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值