Wo finde ich eine kostenlose oder Open -Source -C ++ - Bibliothek, um BCD -Mathematik zu machen? [abgeschlossen

StackOverflow https://stackoverflow.com/questions/6302195

  •  25-10-2019
  •  | 
  •  

Frage

Wo finde ich eine kostenlose oder Open -Source -C ++ - Bibliothek Binär codierte Dezimalzahl Mathematik?

War es hilfreich?

Lösung

Bitte schön. Ich habe das gerade geschrieben und mache es öffentlich.

Es konvertiert einen nicht signierten BCD in eine nicht signierte INT und umgekehrt. Verwenden Sie BCD2I (), um Ihre BCDs in unsignierte INTs zu konvertieren, tun Sie die benötigten Mathematik und verwenden Sie dann i2bcd (), um die Zahlen wieder zu BCD zu bringen.

unsigned int bcd2i(unsigned int bcd) {
    unsigned int decimalMultiplier = 1;
    unsigned int digit;
    unsigned int i = 0;
    while (bcd > 0) {
        digit = bcd & 0xF;
        i += digit * decimalMultiplier;
        decimalMultiplier *= 10;
        bcd >>= 4;
    }
    return i;
}

unsigned int i2bcd(unsigned int i) {
    unsigned int binaryShift = 0;  
    unsigned int digit;
    unsigned int bcd = 0;
    while (i > 0) {
        digit = i % 10;
        bcd += (digit << binaryShift);
        binaryShift += 4;
        i /= 10;
    }
    return bcd;
}
// Thanks to EmbeddedGuy for bug fix: changed init value to 0 from 1 


#include <iostream>
using namespace std;

int main() {
int tests[] = {81986, 3740, 103141, 27616, 1038, 
               56975, 38083, 26722, 72358, 
                2017, 34259};

int testCount = sizeof(tests)/sizeof(tests[0]);

cout << "Testing bcd2i(i2bcd(test)) on 10 cases" << endl;
for (int testIndex=0; testIndex<testCount; testIndex++) {
    int bcd = i2bcd(tests[testIndex]);
    int i = bcd2i(bcd);
    if (i != tests[testIndex]) {
        cout << "Test failed: " << tests[testIndex] << " >> " << bcd << " >> " << i << endl;
        return 1;
    }
}
cout << "Test passed" << endl;
return 0;
}

Andere Tipps

Soweit ich weiß, sind Konversionsfehler nicht immer akzeptabel. Da Fehler nicht vermieden werden können, sind BCD -Berechnungen manchmal ein Muss. Xbcd_math beispielsweise ist eine vollständig vorgestellte BCD -Schwimmpunktbibliothek.

Mathematik ist Mathematik - es spielt keine Rolle, dass Sie in Basis 2 in Basis 10 oder in Basis 16 hinzufügen oder multiplizieren. Die Antwort ist immer gleich.

Ich weiß nicht, wie Ihr Eingang und Ihre Ausgabe codiert werden, aber alles, was Sie brauchen sollten, ist von BCD in Ganzzahl konvertiert, mathematik, genau so, wie Sie es normalerweise tun würden, und am Ende von Integer zu BCD neu konvertieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top