方法
因为二进制是由0/1 组成的一串数字, 我们可以把 长度为 n 的二进制位中位为 1 的所有位置视为 序列 n 的所有选择的元素位置, 如 1001, 表示长度为 4 的序列中的 第1个元素和第 4 个元素。
所以说我们只要遍历一遍 2^n 内的所有二进制数, 就能获得长度为 n 中有 1 的二进制数的所有可能性。
比如, 我们求 n == 3 的所有子集, 2^3 == 8(10) == 1000(2), 所以说长度 <= 3 的二进制数转化成十进制 是小于 8 的。
如何获取 某二进制数的哪一位是 1 呢? 这用到了 位运算的 & 操作, 这个 x & (1 << s) 就可以知道 x 倒数第 s 位是 0 还是 1。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int main()
{
int n;
cin >> n;
for(int i = 0; i < (1<<n); i ++)
{
for(int j = n-1; j >= 0; j --)
cout << (bool)(i&(1<<j)) << " ";
cout << endl;
}
return 0;
}