所有可能的组合位

时间:2015-02-09 12:09:50

标签: c++ algorithm binary

我正在研究C ++程序,以演示编码理论的工作原理(在使用线性代码进行纠错的意义上)。我将奇偶校验位添加到一串位('字')。这样我仍然可以看到在传输过程中某些位发生了变化时的消息(错误检测和纠正)。要知道的一件重要事情是两个单词之间的最小距离。为了计算这个,我需要编译所有可能单词的列表并将它们相互比较。如果我的纠错码由长度为n = 6的单词组成,则会有2 ^ 6 = 64种可能的组合。我的问题是如何生成所有这些可能的单词并将它们存储在数组中。

这些是这些词语的两个实例:

0 0 0 0 0 0
1 0 0 0 0 0
1 1 0 1 0 1

我知道我可以使用这样的算法生成两个数字的组合:

   for (int i = 1; i <= 5; i++)
        for (int j = 2; j <= 5; j++)
            if (i != j)
                cout << i << "," << j << "," << endl;

但是,此代码仅生成两个数字的组合,并且还使用1或0以外的数字。

修改

我创建了一些for循环来完成这项工作。它不是特别优雅:

int bits[64][6] = { 0 };

for (int x = 0; x < 32; x++)
    bits[x][0] = 1;

for (int x = 0; x < 64; x += 2)
    bits[x][1] = 1;

for (int x = 0; x < 64; x += 4)
{
    bits[x][2] = 1;
    bits[x + 1][2] = 1;
}

for (int x = 0; x < 64; x += 8)
{
    bits[x][3] = 1;
    bits[x + 1][3] = 1;
    bits[x + 2][3] = 1;
    bits[x + 3][3] = 1;
}

for (int x = 0; x < 64; x += 16)
{
    for (int i = 0; i < 8; i++)
        bits[x + i][4] = 1;
}

for (int x = 0; x < 64; x += 32)
{
    for (int i = 0; i < 16; i++)
        bits[x + i][5] = 1;
}

3 个答案:

答案 0 :(得分:3)

您可以使用以下内容:http://ideone.com/C8O8Qe

template <std::size_t N>
bool increase(std::bitset<N>& bs)
{
    for (std::size_t i = 0; i != bs.size(); ++i) {
        if (bs.flip(i).test(i) == true) {
            return true;
        }
    }
    return false; // overflow
}

然后迭代所有值:

std::bitset<5> bs;

do {
    std::cout << bs << std::endl;
} while (increase(bs));

如果size不是编译时值,则可以使用与std::vector<bool>

类似的代码

答案 1 :(得分:2)

我使用iota或类似的:

vector<int> foo(64); // Create a vector to hold 64 entries

iota(foo.begin(), foo.end(), 0); // Inserts the range of numbers in foo [0,foo.size())

for(auto& i : foo){
    cout << bitset<6>(i) << endl;
}

我可能还应该指出int是一个sizeof(int)位的集合,所以希望你可以使用逐位运算符来处理它。

如果你必须使用更多字面的比特集合,我会回答Jarod42的答案,但仍然使用iota

vector<bitset<6>> bar(64);

iota(bar.begin(), bar.end(), 0);

for(auto& i : bar){
    cout << i << endl;
}

答案 2 :(得分:1)

使用从0到62的双循环,从第一个循环索引到63。

循环内部将两个索引转换为二进制。 (一种简单的方法是转换为十六进制并将十六进制数字扩展为四位。)