問題
32ビットの数値を作成する必要があり(符号付きか符号なしかは関係ありません。とにかく最上位ビットが設定されることはありません)、各数値には特定の数のビットが設定されている必要があります。
素朴な解決策
もちろん、最も簡単な解決策はゼロから始めることです。ループ内では、数値が 1 ずつ増加し、ビット数がカウントされます。カウントが目的の値である場合、数値がリストに格納されます。そうでない場合は、ループが繰り返されます。十分な数が見つかった場合、ループは停止します。もちろん、これは問題なく動作しますが、必要なビット数が非常に多くなると、非常に遅くなります。
より良いソリューション
(たとえば) 5 ビットが設定されている最も単純な数値は、最初の 5 ビットが設定されている数値です。この番号は簡単に作成できます。ループ内で最初のビットが設定され、数値が 1 つ左にシフトされます。このループは 5 回実行され、5 ビットが設定された最初の数値が見つかりました。次の数も簡単に作成できます。ここで、数値が 6 ビット幅であると仮定し、最高の数値は設定されていません。ここで、最初の 0 ビットを右にシフトし始め、101111、110111、111011、111101、111110 を取得します。前に別の 0 を追加してこのプロセスを繰り返すことで、これを繰り返すことができます。0111110、1011110、1101110 など。ただし、この単純なアプローチを使用すると、1010111 などの数字が除外されるため、数字が必要以上に速く成長します。
次の数値のビット数に関係なく、設定する必要があるビット数に関係なく、使用できるすべての可能な順列、一般的なアプローチを作成するより良い方法はありますか?