位运算与子集
来源:互联网 发布:mac的windows截屏 编辑:程序博客网 时间:2024/05/18 17:03
很多时候,我们需要求一个集合子集,对于求子集,对于集合元素要么存在于子集中,要么不存在,
因此可以抽象用1位二进制数来表示,当该值为0,表示这个元素不在该集合中,反之则存在。
比如{a,b,c,d}, 求该集合子集,可以退化成4位二进制数_ _ _ _的排列问题, 总共排列2*2*2*2=16.
位操作1<<1=0b10, 1<<2=0b100,1<<3=0b1000,1<<4=0b10000=16,为所有子集个数,
因此若一个集合有n个元素,则子集个数为1<<n个,生成所有子集代码如下:
void bo(){ for(int i = 0; i < 1<<(size); i++) { for(int j = 0; j < size;j++) { sa[i][j] = i&(1<<j)&&1; // cout<<sa[i][j]<<" "; } cout<<endl; }}
下面是一个利用位操作,求子集的例子:
#include <iostream>using namespace std;#define MAX 100int size = 0;int sa[MAX*MAX][MAX]={0};char ca[MAX];void genca();void bo();void subset();int main(void){ cout<<"size:"; cin>>size; genca(); bo(); subset(); return 0;}void bo(){ for(int i = 0; i < 1<<(size); i++) { for(int j = 0; j < size;j++) { sa[i][j] = i&(1<<j)&&1; cout<<sa[i][j]<<" "; } cout<<endl; }}void genca(){ for(int i=0;i<size;i++) ca[i]='a'+i;}void subset(){ for(int i=0;i<1<<size;i++) {for(int j=0;j<size;j++) if(sa[i][j]) cout<<ca[j]<< " ";cout<<endl; }}
./bosize:30 0 0 1 0 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 1 1 1 1 a b a b c a c b c a b c
0 0
- 位运算与子集
- 位运算枚举子集
- 位运算求子集数
- 利用位运算枚举所有子集
- ACM 利用位运算枚举所有子集
- 【位运算符与逻辑运算符知识点】【二进制枚举子集】【just for 状压】
- 用位运算获得集合的所有子集
- 位运算之求集合的所有子集
- 【Java】通过位运算求一个集合的所有子集
- 【bzoj2073】【[POI2004]PRZ】位运算枚举子集的特技
- 通过位运算求一个集合的子集
- 赋值运算与位运算
- 位运算符与位运算
- 枚举与位运算
- 位运算与余数
- 二进制与位运算
- 位运算与加减法
- 指针与位运算
- jdk自带访问https和apache httpclient访问htts的SLL报错处理
- Android浏览图片,点击放大至全屏效果
- 求三元组的最值问题
- UVa 10004 - Bicoloring
- blank
- 位运算与子集
- Yii路径总结
- Javascript事件绑定的几种方式
- 数据库更新方法二(很牛的样子)
- 超详细的vim+cscope 的使用规则
- C语言基础
- 一些错误的想法和错误的感悟
- zoj 3511 Cake Robbery(乱搞)
- 程序员必知的8大排序(java实现)(http://www.admin10000.com/document/794.html)