2016-07-01 29 views
0

Angenommen, ich möchte über alle Bitfolgen (aus Mangel an besserem Namen) im Bereich 0000 - 1111 iterieren. Wenn ich es auf 24 Bits skalieren möchte, kann ich nicht einfach alle möglichen Permutationen vorher berechnen; Ich müsste sie im laufenden Betrieb berechnen.Iterieren über alle möglichen Bit-Permutationen

Wie kann ich die Permutationen on-the-fly (wie Python-Generatoren mit yield) mit etwas wie InputIterator oder eine dekorierte While-Schleife generieren?

+5

Wie zählt man von 0b0000 bis 0b1111? – Quentin

+1

Kannst du nicht einfach eine Schleife für (int i = 0; i <1 << 24; ++ i) machen? Es würde alle erforderlichen Bit-Kombinationen durchlaufen. – buld0zzr

Antwort

3

Wenn ich nicht falsch verstanden habe, können Sie ein int verwenden (das sowieso im Kern als Bits gespeichert ist), band Ihre Schleife nur an die breiteste int, die der Platz erlauben würde (in diesem Fall 24 Bits)). Beginnend bei 0 und sukzessive zu addieren, wird implizit jedes mögliche Bit-Combo durchlaufen.

Es ist nicht notwendig, irgendetwas vorher zu berechnen oder zu speichern. hier ist ein 4-Bit-Beispiel:

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

In diesem Fall DoSomething (const unsigned long int &) einfach die Bits Karte könnte und führen Sie die Aktion, die Sie suchen sind.

Wenn Ihre Implementierung dies unterstützt, verwenden Sie den Typ uint_32t für eine explizite und exakte Breite.

+1

Wenn Sie googlen und dies finden, vergessen Sie nicht, 'long' für' i' zu verwenden! –

+0

Danke, aktualisiert. :) –

+1

Normalerweise sollten Sie unsigned bevorzugen, wenn Sie mit Bits arbeiten. Da Sie eine Mindestanzahl von Bits wünschen, würde ich lieber "uint32_t" (oder eine seiner Varianten) verwenden, anstatt "unsigned long". – Hurkyl