0

OK、私がやろうとしていることは少し複雑に聞こえるかもしれませんが、まだ理解できません:

  • 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 ビット変数でカウントアップします。ビット位置を通るビットパターン ループごとに、カウンタのビット位置を対応する「変数」ビット位置にマップし、そのビット値を に設定し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 に答える