Наиболее оптимальный вариант без использования массивов:
std::string get_binary(int x, int n) {
string s = "";
for (int i = n - 1; i >= 0; --i) {
s.push_back('0' + ((x >> i) & 1));
}
return s;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < (1LL << n); ++i) {
cout << get_binary(i, n) << endl;
}
}
С использованием массивов:
int main() {
int n;
cin >> n;
vector<vector<bool>> arr(1LL << n, vector<bool>(n, 0)); // vector<bool> для чуть большей оптимизации использования памяти
for (int i = 0; i < n; ++i) {
bool curr = false;
int frequency = 1LL << i;
int j = 0;
while (j < arr.size()) {
for (int k = 0; k < frequency; ++k, ++j) {
arr[j][i] = curr;
}
curr = !curr;
}
}
for (int i = 0; i < arr.size(); ++i) {
for (int j = n - 1; j >= 0; --j) {
cout << (arr[i][j] ? '1' : '0');
}
cout << endl;
}
}
Вывод: