![](/img/trans.png)
[英]generate all possible combinations of n bit binary numbers wherein k bits are always set using backtracking only
[英]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.