1.问题描述:
2.知识准备:
cout<(1<<3)<<endl;//左移相当于1*2的3次方,输出为8
cout<<(100&101)<<endl;//按位与,输出为100
cout<<(100|101)<<endl;//按位或,输出为101
cout<<(2&1)<<endl;//输出为0,实际是10&01
3.输出全子集:输出集合{0,,1,2,}的全部子集
(1)思路描述:
相当于输出对应的二进制位,就是全子集
(2)代码:
#include<iostream>
using namespace std;
void f1(int n){
for(int i=0;i<(1<<n);i++){
for(int j=0;j<n;j++){
if(i&(1<<j)){
cout<<j<<" ";
}
}
cout<<endl;
}
}
int main(){
f1(3);
return 0;
}
(3)运行结果:
4.输出n个数中任意m个数的组合:输出集合{0,,1,2,} 3个数中2个数的全部子集
(1)思路描述:在全子集的基础上检查二进制数中包含1 的个数为m个
(2)代码实现:
#include<iostream>
using namespace std;
void f1(int n,int m){
for(int i=0;i<(1<<n);i++){
int num=0,kk=i;
while(kk){
kk=kk&(kk-1);
num++;
}
//通过按位与的操作来判断多少个1比如5,二进制位101,有2个1
//5&(5-1)=5&4=101&100=100(4)
//然后继续循环4&(4-1)=4 & 3=100 & 011=000(0),循环结束
if(num==m){
for(int j=0;j<n;j++){
if(i&(1<<j)){
cout<<j<<" ";
}
}
}
cout<<endl;
}
}
int main(){
f1(3,2);
return 0;
}
(3)运行结果