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


von Kim (Gast)


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

von Kim (Gast)


Lesenswert?

Kim schrieb:
> Dabei sollten sich aber in jedem Schritt das MSByte und das LSByte.

... ändern.

von Kim (Gast)


Lesenswert?

Kim schrieb:
> widerholt.

wiederholt.

von Salewski, Stefan (Gast)


Lesenswert?

Na du musst doch jeweils nur 257 (256+1) addieren.
Plus 256 erhöht das obere Byte um eins, plus 1 gleichzeitig das untere.
Ohne Gewähr und ohne groß nachzudenken.

von Kim (Gast)


Lesenswert?

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

von Bernhard R. (barnyhh)


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

von (prx) A. K. (prx)


Lesenswert?

Kim schrieb:

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

0000 0101 0202 ... FFFF 0100 0201 0302 ... 00FF 0200 0301 ...
Modulo-Rechnung eben. Informatik muss nicht völlig sinnlos sein. ;-)

von Kim (Gast)


Lesenswert?

Bernhard R. schrieb:
> expandierte Parity

OK. Die "expandierte Parity" ist für 16 Bit:

ungerade: 0000 0000 0000 0000
gerade:   1111 1111 1111 1111

?

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

von Kim (Gast)


Lesenswert?

A. K. schrieb:
> 0000 0101 0202 ... FFFF 0100 0201 0302 ... 00FF 0200 0301 ...
> Modulo-Rechnung eben. Informatik muss nicht völlig sinnlos sein. ;-)

Ehrlich gesagt, blick ich das noch nicht.

von (prx) A. K. (prx)


Lesenswert?

Kim schrieb:

> Ehrlich gesagt, blick ich das noch nicht.

Dann zähl eben alle 65536 Kombinationen durch.
Oder lass deinen PC das tun.

von Kim (Gast)


Lesenswert?

Nee ... wie ich das programmtechnisch umsetzte, meinte ich.

von Kim (Gast)


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?!

von (prx) A. K. (prx)


Lesenswert?

Kim schrieb:
> Nee ... wie ich das programmtechnisch umsetzte, meinte ich.

Stefans Vorschlag:
1
uint16_t i = 0;
2
while (1) {
3
  i += 0x0101;
4
}

von Kim (Gast)


Lesenswert?

Kim schrieb:
> Kann ich nicht einfach 0000 ... 1111 durchzählen und drauf
>
> Zahl := temp XOR 16-Bit expandierte Parity(temp)
>
> anwenden.
>
> Sollte doch auch gehen?!

Natürlich nicht, dann ändert sich ja MSByte und LBByte nicht bei jedem 
Schritt  ... mpf

von Salewski, Stefan (Gast)


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

von (prx) A. K. (prx)


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.

von eProfi (Gast)


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).

von Kim (Gast)


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.

von Salewski, Stefan (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.