2015-02-09 116 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; 
}