私の問題は次のとおりです。値x
とパターンp
の両方の変数が同じサイズです。目標は、p によってマスクされていないx のすべてのビット パターンを反復処理することです。
例: がある場合、 、、、および- をこの順序でp = 1001
検索する必要はありません。0000
0001
1000
1001
C99 の標準実装 (戻り値は、既にすべての値を返したかどうかを示します):
static bool next(size_t val, size_t mask, size_t *out) {
if (val == mask) {
return false;
}
size_t current = val & mask;
size_t inc = 1;
size_t new_val = current + inc;
while ((new_val & mask) <= current) {
inc++;
new_val = current + inc;
}
*out = new_val;
return true;
}
これをより効率的にするためのトリックが必要だと思いますが、大きな改善点を見つけることができないようです (マスクの末尾のゼロを計算し、 inc の開始値を適切に設定することを除いて、これはあまり重要ではありません)改善)。
編集:また、生成された値ごとに多くの追加作業が生成されるという事実も重要です。つまり、多くの重複が問題外であることを意味します(一部の重複は、認識できなくても問題ありません。副作用はありません仕事が終わった、それはただの減速です)。