Ich weiß, dass Sie diese Tabelle verwenden können, um Dezimal zu BCD zu konvertieren:
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
Gibt es eine Gleichung für diese Konvertierung oder müssen Sie nur die Tabelle verwenden? Ich versuche, Code für diese Konvertierung zu schreiben, aber ich bin mir nicht sicher, wie ich die Mathematik dafür machen soll. Vorschläge?
Sie kennen das Binärzahlsystem , nicht wahr?
Sehen Sie sich speziell dieses Kapitel an.
EDIT: Beachten Sie auch den Hinweis von KFro, dass das untere Nibble (= 4 Bit) der binären ASCII-Darstellung der Ziffern in BCD steht. Dies macht Konvertierungen BCD & lt; - & gt; ASCII ist sehr einfach, da Sie nur die führenden 4 Bits hinzufügen / entfernen müssen:
%Vor%Normalerweise, wenn jemand sagt, dass er von Dezimal zu BCD konvertieren will, sprechen sie über mehr als eine Dezimalziffer.
BCD ist oft in zwei Dezimalstellen pro Byte gepackt (weil 0..9 in 4 Bits passt, wie Sie gezeigt haben), aber ich denke, es ist natürlicher, ein Array von Bytes zu verwenden, eins pro Dezimalziffer.
Eine vorzeichenlose n-Bit-Binärzahl passt in ceil (n * log_2 (10)) = ceil (n / log10 (2)) Dezimalziffern. Es wird auch in ceil (n / 3) = Boden ((n + 2) / 3)) Dezimalstellen passen, da 2 ^ 3 = 8 weniger als 10 ist.
In diesem Sinne würde ich hier die Dezimalziffern eines vorzeichenlosen int:
erhalten %Vor%Wenn Sie die Breite Ihres int-Typs kennen, bevorzugen Sie natürlich Arrays fester Länge. Es gibt auch keinen Grund, sich umzukehren, wenn Sie sich daran erinnern können, dass die 0. Stelle die niedrigste ist und nur bei Eingabe / Ausgabe umgekehrt wird. Wenn Sie die niedrigstwertige Ziffer als erste beibehalten, werden digits weise arithmetische Operationen vereinfacht, falls Sie keine feste Anzahl von Ziffern verwenden.
Wenn Sie "0" als einzelne "0" Dezimalziffer und nicht als leere Ziffernfolge (beides ist gültig) darstellen wollen, dann würden Sie speziell nach x == 0 suchen.
Wenn Sie zwei Dezimalstellen pro Byte und "unsigned" die halbe Größe von "unsigned long" möchten (verwenden Sie uint32 und uint64 typedefs, wenn Sie möchten):
%Vor%Damit haben Sie die niedrigstwertige (Einheit) Dezimalziffer im niederwertigsten Halbbyte. Sie können die Schleife auch eine feste Zahl (10 für uint32) von Zeiten ausführen, nicht früh stoppen, wenn nur noch 0 Bits übrig sind, was es dem Optimierer erlauben würde, sie abzurollen, aber das ist langsamer, wenn Ihre Zahlen oft langsam sind.
Dieser Code codiert und decodiert. Benchmarks sind wie folgt.
Ich habe einen Uint64_t verwendet, um den BCD hier zu speichern. Sehr praktisch und feste Breite, aber nicht sehr platzsparend für große Tische. Pack die BCD-Ziffern, 2 bis char [] dafür.
%Vor%HINWEIS: Es scheint, dass es unmöglich ist, selbst mit 64-Bit-Ints mehr als 32 Bit nach links zu verschieben, aber zum Glück ist es durchaus möglich, mit einem Faktor von 16 zu multiplizieren - was glücklicherweise den gewünschten Effekt hat. Es ist auch viel schneller. Geh Figur.
Ich weiß, dass dies bereits beantwortet wurde, aber ich habe dies für nicht signierte Ints unterschiedlicher Größe mit einer Vorlage erweitert, um den spezifischen Code zu erstellen.
%Vor%