所有可能的比特排列

时间:2014-07-28 08:38:58

标签: c++ permutation

是否有任何构建函数可以使用拖尾零来查找给定长度内给定位数的所有扰动?

澄清:#bits = 2#rows = 4

给出

11000000
10100000
01100000
00110000

c++中是否有内置函数?

编辑:澄清一下:我有一个数字(在这个例子中是8Bit long),当数字本身保持在某个值之下时,我想要所有可能的4位排列(在这个例子中:1 << 4 + 1 << 3

3 个答案:

答案 0 :(得分:3)

您可以使用以下内容:

int main()
{
    std::vector<bool> v(8);
    v[2] = v[3] = true;

    do {
        print(v);
    } while (std::next_permutation(begin(v), begin(v) + 4));
    return 0;
}

Live example

答案 1 :(得分:1)

你在找这样的东西吗?

std::vector<bool> bits;
/* fill it somehow */
do {
  /* something with bits */ 
} while(std::next_permutation(bits.begin(), bits.end()));

答案 2 :(得分:0)

#include <iostream>
#include <bitset>

int main(int argc, char** argv) {
    const int bits = 2;
    const int rows = 4;
    const int numbits=8;

    for (int i=0;i<rows;i++) {
        std::cout << std::bitset<numbits>(i<<(numbits-bits)) << std::endl;
    }
}

请注意,行和numbits是多余的,如果您只需要所有组合,则可以替换它们:

int main(int argc, char** argv) {
    const int bits = 2;
    for (int i=0;i<1<<bits;i++) {
        std::cout << std::bitset<bits>(i) << std::endl;
    }
}

这两个实现都执行@ user2864740建议的操作:计算整数并打印二进制表示。第一个允许您选择要打印的数量以及是否需要尾随零。