2016-07-01 15 views
0

0000 - 1111の範囲内のすべてのビットシーケンス(より良い名前がないため)に対して反復したいとします。私が24ビットにスケールアップしたいときは、すべての可能な順列を単純に計算することはできません。私はそれらをオンザフライで計算する必要があります。可能なすべてのビット順列を反復する

や装飾されたwhileループのようなものを使用して、オンザフライで(yieldのPythonジェネレータのような)パーミュテーションを生成するにはどうすればよいですか?

+5

0b0000から0b1111までのカウントはどうですか? – Quentin

+1

(int i = 0; i <1 << 24; ++ i)のループはできませんか?それはすべての必要なビットの組み合わせを行くだろう – buld0zzr

答えて

3

私が誤解していない限り、int(これはコアのビットとして保存されています)を使用すると、スペースが許す最大の整数(この場合は24ビット)。 0から始まり、連続するものを追加することは、潜在的なすべてのビットコンボを暗黙のうちにステップする。

何も事前に計算したり保存する必要はありません。ここでは4ビットの例です。この場合は

for(unsigned long int cnt = 0; cnt < 16; cnt++) DoSomething(cnt); 

のdoSomething(& int型のconst unsigned long型)は、単にビットをマッピングし、あなたが探しているアクションを実行することができます。

実装でサポートされている場合は、明示的で正確な幅にはuint_32tタイプを使用してください。

+1

あなたがグーグルでこれを見つけるなら、 '私は'のために '長い'を使用することを忘れないでください! –

+0

ありがとうございました。 :) –

+1

通常、ビットを扱うときは符号なしを優先します。また、最小限のビット数が必要なので、 'unsigned long'ではなく' uint32_t'(またはその変形の1つ)を使用することをお勧めします。 – Hurkyl

関連する問題