Unsigned to Integer to BCD Konvertierung?

7

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?

    
Jack Null 11.09.2009, 00:02
quelle

10 Antworten

6

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%     
schnaader 11.09.2009, 00:04
quelle
6

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.

    
Jonathan Graehl 11.09.2009 00:31
quelle
6

Dies stammt aus der Welt der Mikrocontroller. Beachten Sie, dass die Werte in der Division gerundet sind. Zum Beispiel wäre 91 zu BCD 91/10 * 16 = 144 + 91% 10 = 145. In Binary konvertiert ist 10010001.

%Vor%     
nmushov 07.02.2012 01:31
quelle
6
%Vor%     
Simon Peverett 14.01.2014 08:15
quelle
1

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.

    
Jonathan Graehl 11.09.2009 00:39
quelle
0

Würde so etwas für Ihre Konvertierung funktionieren?

%Vor%     
CTT 11.09.2009 00:12
quelle
0

Dieser Code codiert und decodiert. Benchmarks sind wie folgt.

  • 45 Uhren für die Hin- und Rückfahrt
  • 11 Uhren zum Entpacken von BCD nach uint32_t
  • 34 Uhren für das Verpacken von uint32_t in BCD

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.

    
RocketRoy 08.11.2014 00:28
quelle
0

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%     
Andrew Stern 11.01.2017 18:58
quelle
0

Hier ist ein Makro für uint16_t, so dass es zur Kompilierungszeit ausgewertet wird (vorausgesetzt, dass Sie eine vordefinierte Konstante verwenden). Dies stimmt mit dec2bcd () von oben bis 9999 überein.

%Vor%     
Ray Foulk 07.08.2017 16:56
quelle
0

Einfach vereinfacht.

%Vor%     
randz 06.11.2017 11:44
quelle

Tags und Links