我需要生成一些长度 n 的位代码。假设 n = 3 ,那么我有两种不同的情况
1)我需要在 1 位置生成以位集 1 开头的所有位
100
101
110
111
2)位位置 1 位 0 的位代码
000
001
010
011
然后是位位置2和3的相同过程。
我非常感谢任何帮助。
答案 0 :(得分:2)
最简单的方法之一是生成所有2位线(00,01,10,11)的集合。之后,您可以在第i个位置插入0或1,以获得必要的3位线组。例如,如果你需要'位置为0位的位代码',你可以将'0'放在所有这四个2位线的第一个位置。
答案 1 :(得分:1)
提示:您对算法的描述是递归的!
这是8
位序列的示例。理论上它可以根据需要处理多个位,但复杂度为O(2^n)
,所以你会遇到大n
个硬墙。
原则是显式处理1位情况,并依赖递归来处理重新执行位。当我们没有任何要处理的位时,我们输出当前序列。
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
template <class T, class T2>
void bitseq(T begin, T2 end, std::function<void()> output) {
if(end == begin) {
output();
} else {
*begin = 0;
bitseq(begin+1, end, output);
*begin = 1;
bitseq(begin+1, end, output);
}
}
int main(int argc, char* argv[]) {
std::vector<int> bits(8, 0);
bitseq(bits.begin(), bits.end(), [&] {
std::copy(bits.begin(), bits.end(),
std::ostream_iterator<int>(std::cout, ""));
std::cout << std::endl;
});
}