指定されたマスクのすべてのサブパターンを反復します


特定の長さのすべてのビットシーケンスを列挙する必要がある場合があります。言い換えれば、可能なすべてのオプションを反復処理し、各オブジェクトに対して 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 を処理するのにかかる時間です。

特定の長さのすべてのビットシーケンスを列挙する必要がある場合があります。言い換えれば、可能なすべてのオプションを反復処理し、各オブジェクトに対して 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 を処理するのにかかる時間です。