所有可能的组合位
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的双循环。
在循环内部,将两个索引转换为二进制索引。(一个简单的方法是转换为十六进制并将十六进制数字扩展为四位。)
相关文章:
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 有可能使shared_ptr协变吗
- 有可能在信号处理程序中设置promise吗
- 是否有可能实现O(N)时间和O(1)空间解决方案,以实现C++中的字符串循环移位
- 是否有可能构建面向Linux和Windows的.Net Core C++ / CLI应用程序?
- 是否有可能使用debug_info获取ELF文件的源代码?
- C++,是否有可能/如何定义在.h和.cpp源文件中调用函数的类构造函数
- 有可能在C++中有类的查找表吗
- 是否有可能让 c++ dll 在后台运行 python 程序并让它填充向量图?如果是这样,如何?
- 向量的大小是否有可能为 1 但其中的元素数量为零?
- 是否有可能编写新的叮当声现代化规则?
- 是否有可能通过指向另一个未关联的子对象的指针来获取指向一个子对象的指针?
- 是否有可能通过演绎指南实现整个 std::make_tuple 功能?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 如果我们从每个 Y 向量中选择一个值,则 X 数字的每个组合都可能
- 是否有可能具有放入容器的移动操作的类型?
- 是否有可能通过溢出 C 中的第一个元素来写入数组第二个元素
- 是否有可能组合对称的代码片段