Lottoreihen: Bit-Kodierung / Dekodierung in "C"

papko

Grünschnabel
Hallo Mitglieder des Forums, vielleicht könnt ihr mir beim folgendem Problem weiterhelfen.

Eine Lottoreihe z.B 1, 2, 3, 8, 9, 10 soll folgendermassen Bitkodiert werden:
Gesetztes Bit X = Zahl X (von rechts nach links in der Bitfolge). Also: 11 10000111.

Da es Lottozahlen von 1 bis 49 gibt, wird man eine 64 Bit Kodierung brauchen.

Benötigt wird:

1) eine Funktion, die eine bestimmte Bitposition (eine Lottozahl aus der Reihe), setzen kann

2) auf diese Bitkodierung sollen später Bitoperationen (AND) anwendbar sein

3) eine Funktion um den 64 Bit (.... 11 10000111) wieder zu dekodieren, um z.B die Reihe 1, 2, 3, 8, 9, 10 auszugeben

Sind Bitfelder einzusetzen ?

Eine effiziente Lösung in C ist gesucht, da ca 14 Mio Reihen mit diesem Verfahren kodiert/dekodiert werden.


Einen guten Rutsch in neue Jahr !
 
Er will ja pro Zahl ein Bit auf die richtige Position gesetzt haben...also doch 64 bit.

Zeigst du uns einmal deinen Ansatz bzw. stellst eine Frage?

PS: Willkommen bei tutorials.de :)
 
Dankeschön, da ich sehr oft Beiträge des Forums gelesen habe, wollte ich nun auch mal ein Thema posten.

Richtig "Sheel", ich will für jede Zahl einer 6-er Lottoreihe, ein bestimmtes Bit setzen. Die Lottozahl gibt sozusagen die Bitposition vor:

BSP: Wir haben die Lottoreihe: 1, 2, 3, 8, 9, 10

Die Zahl "1": setzt das Bit 0 auf 1
Die Zahl "2": setzt das Bit 1 auf 1
Die Zahl "3": setzt das Bit 2 auf 1
Die Zahl "8": setzt das Bit 7 auf 1
Die Zahl "9": setzt das Bit 8 auf 1
Die Zahl "10": setzt das Bit 9 auf 1

Die Frage ist wie die Funktion das richtige Bit setzen soll, sowie die Dekodierung der 64 Bits später in die Reihe: 1, 2, 3, 8, 9, 10
 
Zuletzt bearbeitet:
Zuerst brauchst du natürlich ein 8-Byte-int, ich nenns hier i
Am Anfang auf 0 setzen.

Das x. Bit setzt du dann so:

i=i|(1<<x);

zB
i=i|(1<<1);
i=i|(1<<2);
i=i|(1<<3);
i=i|(1<<8);
i=i|(1<<9);
i=i|(1<<10);

Wenn du die Zahlen in einem Array hast, kannst du das einfach in einer Schleife machen.

Dann, zum auslesen kannst du so prüfen, ob die Zahl x gesetzt ist:
if(i&(1<<x))...

Gruß
 
Achso, ja klar, sorry war noch nicht ganz wach ;)
Um es ganz simpel zu machen:
Du kannst die einzelnen Zahlen ihrem entsprechend Bitmuster zuordnen und anschließend zusammenaddieren.
Die entsprechende Zahl erhälst du so:
Gegeben sei deine Lottozahl n:
Code:
zahl = 2^(n-1)

Kleiner Test:
1: 2^(1-1) = 1 = 1b
2: 2^(2-1) = 2 = 10b
3: 2^(3-1) = 4 = 100b
8: 2^8(8-1) = 128 = 1000000b

Zusammenaddiert ergibt das dann: 1000111b
 
Zurück