特定の長さのすべてのビットシーケンスを列挙する必要がある場合があります。言い換えれば、可能なすべてのオプションを反復処理し、各オブジェクトに対して 2 つの可能な状態のいずれかが選択されます。
このような状況では、ビット マスクを使用して列挙を実装することが可能です。このアプローチの利点は、そのようなコードが非再帰的に機能し、コレクションなどではなく数値を操作することで、パフォーマンスが大幅に向上することです。
ビットマスクを使用した一般的なコードを以下に示します。
intn; // oobjects の数 (ビット シーケンスの長さ)
for (int mask = 0; mask < (1 << n); mask++) { // 0 から 2^n - 1 までのすべての数値をループし、各数値はビットマスクに対応します
// 現在の数値マスクはビットマスクで、i 番目のビットは i 番目のオブジェクトの状態を指定します
for (int i = 0; i < n; i++) { // n ビットを繰り返し処理して、各オブジェクトの状態を理解します
if ((1 << i) & mask) { // i 番目のビットが 1 に等しいかどうかを確認します
// i 番目のオブジェクトが状態 '1' を持つオプションを処理します。
}
else { // i 番目のビットがゼロの場合
// 状態 '0' の i 番目のオブジェクトであるオプションを処理します。
}
}
}
プレ>
このコードは O(2^n * f(n)) で実行されます。ここで、f(n) は 1 つの特定の iterable を処理するのにかかる時間です。