Lottoreihen: Bit-Kodierung / Dekodierung in "C"
-
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 in "C": 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:
-
eine Funktion, die eine bestimmte Bitposition (eine Lottozahl aus der Reihe), setzen kann
-
auf diese Bitkodierung sollen später Bitoperationen (AND) anwendbar sein
-
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 !
-
-
Eine schöne Hausaufgabe.
Was hast Du bisher denn schon selbst überlegt oder gemacht?
-
Bisher die Grundlagen der Bitoperationen durchgelesen, sowie gerade mit Internetrecherche beschäftigt, eventuell dieses Problem mit Shift-Operatioen, Bitfelder anzugehen.
-
Zunächst mal schaue nach, ob dein Compiler einen 64Bit Integer Datentyp bereitstellt, wann ja, dann brauchst du keine Bitfelder.
Teste mal die Existenz von unsigned long long oder ULONGLONG, unter C99 muss der Standarddatentyp uint64_t vorhanden sein.
Zum Setzen, Löschen und Abfragen von Einzelbits brauchst du kein Shift.
-
Zum Setzen, Löschen und Abfragen von Einzelbits brauchst du kein Shift
Ist aber praktisch.
-
Ich benutze den Compiler DEV C++, dieser unterstützt den erweiterten long-Datentyp: unsigned long long, 8 Bytes,
Wertebereich: 0 - 18446744073709551615BSP: 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 1Die Frage ist wie die Funktion das richtige Bit setzen soll, sowie die Dekodierung der 64 Bits später um z.B die Ausgabe: 1, 2, 3, 8, 9, 10 zu erhalten.
Bedenkt dabei es sind 14 Mio Reihen zu kodieren. Daher die Suche nach einer schnellen Kodierung in dieser Form.
-
papko schrieb:
Bisher die Grundlagen der Bitoperationen durchgelesen
Und Du hast dabei nicht die Antworten für Deine Standardbeispiele gefunden? Glaub ich nicht.
-
Verwende deinen Gehirnschmalz woanders, das kann man auch ohne Bit-Codierung effizient lösen!
Ich wäre an einem zuverlässigen Algorithmus interessiert, der mir vor der Ziehung die passenden Lottozahlen liefern kann. Eine Seite im Internet wäre auch willkommen, wo ich am Freitag die Zeitung vom folgenden Montag lesen kann.
-
berniebutt schrieb:
Verwende deinen Gehirnschmalz woanders, das kann man auch ohne Bit-Codierung effizient lösen!
Ich wäre an einem zuverlässigen Algorithmus interessiert, der mir vor der Ziehung die passenden Lottozahlen liefern kann. Eine Seite im Internet wäre auch willkommen, wo ich am Freitag die Zeitung vom folgenden Montag lesen kann.
Wenn Du Deinen Blumen in der Stube kein Wasser gibst, weist Du, dass sie
vertrocknen werden. Du, berniebutt, kannst also sehrwohl die Zukunft sehen!
:p
-
#define SETZE(x,b) ( x |= 1 << (b) ) #define LOESCHE(x,b) ( x &= ~(1 << (b)) ) #define PRUEFE(x,b) ( x & (1 << (b)) )
Wie du vielleicht erkennst, sind dies Makros und keine Funktionen.
-
Die Makros von "Wutz" funktionieren !! Herzlichen Dank, und auch an die anderen Mitglieder.
P.S Steht die Lösung von "Wutz" in euren Büchern als Standardbeispiel ?