Alle Möglichkeiten einer 16-Bit-Zahl, aber MSByte und LSByte sollen sich bei jedem Schritt ändern

Gast #2473266
Lesenswert?

Hallo,

ich bin auf der Suche nach einem Algorithmus ( soll in C programmiert 
werden), welcher in einer Schleife alle möglichen Kombinationen einer 
16-Bit-Zahl ausgibt, also 0 bis 65535.

Dabei sollten sich aber in jedem Schritt das MSByte und das LSByte.
Also nicht einfach:

for( i = 0; i < 65535; i++)

Am besten wäre, wenn sich keine Zahl widerholt.

Ich habe schon einen einen Zufallsgenerator gedacht und jede schon 
aufgezählten Wert speicher und vergleich. Aber etwas aufwendig ...

Oder im das MSByte toggeln und das LSByte hochzählen, und dann die 
"polarität" des MSByte umkehren und alles von vorne:


MSByte       LSBbyte
0            1
1            2
0            3
1            4
0            5
1            6
...          ...
0            255


wenn beim LSB durch :

MSByte       LSBbyte
1            1
0            2
1            3
0            4
1            5
0            6
...          ...
1            255


und dann:

MSByte       LSBbyte
2            1
3            2
2            3
3            4
2            5
3            6
...          ...
2            255

usw.


Hätte sonst noch jemand eine gute Idee?


Grüße
Kim
#2473295
Lesenswert?

Ich denke, daß derartiges über GREY-Code gehen könnte:

temp := 16Bit Greycode-Counter
Zahl := temp XOR 16-Bit expandierte Parity(temp)

Zur Verdeutlichung 4-bittig:

temp PTY  Zahl
0000 0000 0000
0001 1111 1110
0011 0000 0011
0010 1111 1101
0110 0000 0110
0111 1111 1000
0101 0000 0101
0100 1111 1011
1100 0000 1100
1101 1111 0010
1111 0000 1111
1110 1111 0001
1010 0000 1010
1011 1111 0100
1001 0000 1001
1000 1111 0111

Das scheint zu tun!

Bernhard
Gast #2473325
Lesenswert?

Kim schrieb:
> Wie mach ich das mit dem Greycode-Counter? Da ändert sich ja immer ein
> Bit im Vergleich zur vorigen Zahl?!

Kann ich nicht einfach 0000 ... 1111 durchzählen und drauf

Zahl := temp XOR 16-Bit expandierte Parity(temp)

anwenden.

Sollte doch auch gehen?!
Gast #2473329
Lesenswert?

>Aber dann habe ich doch am Ende nicht alle 65535 Möglichkeiten, sondern
>so nur 255 (oder so) verschiedene Zahlen erzeugt!?

Ja, aber ich hatte dich so verstanden, dass Du gewöhnliche Dualzahlen 
verwenden willst und aufsteigend zählen willst. Da gibt es wohl nur 256 
Möglichkeiten. Sonst musst Du einen anderen Code verwenden, wie Bernhard 
schrieb. Aber mit der Kodierung kann man dann natürlich nicht direkt 
Rechenoperationen durchführen.

http://de.wikipedia.org/wiki/Kategorie:Bin%C3%A4rcode
#2473333
Lesenswert?

Salewski, Stefan schrieb:

> Ja, aber ich hatte dich so verstanden, dass Du gewöhnliche Dualzahlen
> verwenden willst und aufsteigend zählen willst. Da gibt es wohl nur 256
> Möglichkeiten.

Ich hatte es anders verstanden: Er will alle 2^16 Kombinationen 
durchlaufen lassen bevor es sich wiederholt, egal in welcher 
Reihenfolge, nur sollen sich in jedem Schritt MSB und LSB ändern. Und 
genau das leistet dein Vorschlag.
Gast #2473336
Lesenswert?

Lass einen Zähler von 0 bis 65535 zählen und berechne daraus jeweils 
CRC16.
Lass einen Zähler von 0 bis 65535 zählen und invertiere jedes zweite Mal 
mit einer 16-Bit-Konstante (z.B. ffff).
Oder nimm einen 16-Bit RNG (random number generator).
Gast #2473341
Lesenswert?

A. K. schrieb:
> Ich hatte es anders verstanden: Er will alle 2^16 Kombinationen
> durchlaufen lassen bevor es sich wiederholt, egal in welcher
> Reihenfolge, nur sollen sich in jedem Schritt MSB und LSB ändern. Und
> genau das leistet dein Vorschlag.

So ist der Plan. ;-)

Auf jeden Fall Danke für die Vorschläge. Ich werde jetzt versuchen das 
Ganze in C umzusetzen.
Gast #2473346
Lesenswert?

>genau das leistet dein Vorschlag.

Ja, durch den Überlauf. Oder wenn er doch (nur) aufsteigend zählen will, 
könnte er natürlich statt mit 0 mit einem Wert von 1 bis 256 starten, 
und dann jeweils 257 addieren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren