为两种不同的情况生成位代码

时间:2014-06-03 09:00:48

标签: c++ algorithm

我需要生成一些长度 n 的位代码。假设 n = 3 ,那么我有两种不同的情况

1)我需要在 1 位置生成以位集 1 开头的所有位

100
101
110
111

2)位位置 1 0 的位代码

000
001
010
011

然后是位位置2和3的相同过程。

我非常感谢任何帮助。

2 个答案:

答案 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;
    });
}