0

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

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

例如

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

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

我该怎么做呢?有任何想法吗?

4

3 回答 3

5

他们太容易了。

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

x |= mask;
++x;
x &= ~mask;
于 2012-12-16T05:25:43.363 回答
2

使用n 个“变量”位位置在n位变量中计数。对于通过位位置的每个位模式循环,将计数器位位置映射到相应的“可变”位位置,将该位值设置在 a 中std::bitset。或者,如果您更喜欢,可以进行位移。

于 2012-12-16T05:26:12.813 回答
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;
  }
}
于 2012-12-16T08:25:50.507 回答