2015-02-09 110 views
-1

我正在使用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以外的數字。

編輯

我已經創建了幾個循環來完成這項工作。這是不是特別優雅:

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; 
} 
+0

環路打印的COUT兩個數字,所以你怎麼能指望你的代碼打印出6個數字0或1的單詞? – 2015-02-09 12:17:59

回答

1

使用從0雙迴路62,並從第一循環索引到63

裏面的循環的兩個指標轉換爲二進制。 (一個簡單的方法是將轉換爲十六進制和擴大十六進制數字爲4位。)

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)); 

如果大小不是一個編譯時間值,你可以使用類似的代碼與std::vector<bool>

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; 
} 

我應該還指出,一個intsizeof(int)集合位的,所以希望您能與使用位運算符的工作。

如果必須使用位更字面集,我會第二Jarod42的回答,但仍使用iota

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

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

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