获取二进制的所有可能变体 - 给定模式

时间:2012-12-16 05:19:40

标签: c++ c 64-bit bit-manipulation combinations

好吧,我正在尝试做的事情可能听起来有点复杂,但我仍然无法理解:

  • 假设我们有一个unsigned long long 64位整数
  • 我想设置一些“可变”位位置并获取所有可能的派生数字

E.g。

Pattern = 00000000XXXXX000XX000X 
Positions = 0,4,5,9,10,11,12,13

Result (Pattern, Positions) = {
    0000000000000000000000
    0000000000000000000001
    0000000000000000010000
    0000000000000000010001
    0000000000000000100000
    0000000000000000100001
    0000000000000000110000
    0000000000000000110001
    etc...
}

我应该怎么做?有什么想法吗?

3 个答案:

答案 0 :(得分:5)

他们太容易了。

制作要保持不变的位位置的掩码。在每次迭代中:

x |= mask;
++x;
x &= ~mask;

答案 1 :(得分:2)

n “变量”位位置在 n 位变量中计数。对于通过位位置的每个位模式循环,将计数器位位置映射到相应的“可变”位位置,在std::bitset中设置该位值。如果你更喜欢那么可以换位。

答案 2 :(得分:1)

#include <bitset>
#include <iostream>

int positions[] = { 0, 4, 5, 9, 10, 11, 12, 13 };

int main(int argc, char **argv)
{
  int length = sizeof(positions) / sizeof(*positions);
  /* There are 2^length possible combinations */
  for (unsigned long long i = 0; i < 1 << length; i++) {
    unsigned long long pattern = 0;
    for (unsigned long long j = i, k = 0; j != 0; j >>= 1, k++) {
      if (j & 1)
        pattern |= 1ULL << positions[k];
    }
    std::cout << std::bitset<64>(pattern) << std::endl;
  }
}