紫书的方法真是太秒啦,尤其是s&1<<i这个操作,真是秀我一脸,利用<<优先级比&高,来判断s的第i位是否为1,真是太妙了!
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
void print_subset(int n, int s) {
for(int i = 0; i < n; ++i)
if(s & 1 << i)//1右移几位就代表第i个二进制位为1,其他位为0,与状态进行&运算,如果此状态包含该数字,就输出
printf("%d ", i);
printf("\n");
}
int main() {
int n;
while(scanf("%d", &n) == 1) {
for(int i = 0; i < (1 << n) ; ++i)//一共1<<n种可能排列方式
print_subset(n, i);
}
return 0;
}