簡體   English   中英

所有可能的組合位

[英]all possible combinations bits

我正在使用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;
}

您可以使用以下內容: 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>使用類似的代碼

我會使用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;
}

使用從0到62的雙循環,以及從第一個循環索引到63的雙循環。

在循環內部,將兩個索引轉換為二進制。 (一種簡單的方法是轉換為十六進制並將十六進制數字擴展為四位。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM