2016-09-23 5 views
0

Für einen Teil einer größeren Aufgabe, ich schreibe ein Programm, das eine Binärzahl in eine Dezimalzahl konvertiert. Ich weiß, dass die Art und Weise, wie ich es mache, irgendwie komisch ist und wahrscheinlich verbessert werden könnte, aber ich mag es so, wie es jetzt ist, und es funktioniert fast. Das einzige Problem ist, dass wenn Sie es 10 als Ihre Binärzahl füttern, es 1 zurückgibt, aber es sollte 2 zurückgeben. Alle anderen Zahlen, die ich getestet habe, funktionieren ordnungsgemäß. Hier ist der relevante Teil des Codes:Warum gibt mein C-Binär-zu-Dezimal-Programm den richtigen Wert nicht zurück?

int countDigits (int num) { 
    int digits = 0; 
    while (num != 0) { 
     num /=10; 
     digits++; 
    } 
    return digits; 
} 

long int binToDec (int num) { 
    int numDigits = countDigits(num); 
    char temp[32]; 
    int numStore[32]; 
    long int sum = 0; 
    snprintf(temp, 32, "%d", num); 
    for (int i = 0; i < numDigits; i++) { 
     numStore[i] = temp[i] - '0'; 
    } 
    for (int i = 0; i < numDigits; i++) { 
     if (numStore[i] == 1) { 
      sum += pow(2, i); 
     } 
    } 
    printf("%ld\n", sum); 
    return sum; 

} 

int main(void) { 
    binToDec(10); 
    return 0; 
} 

Ich kann absolut nicht herausfinden, warum es nicht den richtigen Wert zurück. Zuerst dachte ich, ich würde in der falschen Reihenfolge iterieren, aber wenn ich es nicht falsch ausführte, führte das Zählen von i nach unten anstatt nach oben zu der gleichen Ausgabe. Könnte jemand auf meinen Fehler hinweisen?

+2

Haben Sie versucht, den Debugger zu verwenden, um durch das Programm zu gehen, so dass Sie Variablen bei jedem Schritt untersuchen können? – Barmar

+2

Weil Sie '2^i' verwendet haben, wo Sie' 2^(numDigits-1-i) 'seit Sie gehen in umgekehrter Reihenfolge verwendet haben sollten. – Nelfeal

+1

"Ich kenne die Art, wie ich es mache, ist irgendwie komisch" - was für eine Untertreibung. Sie interpretieren die dezimale Darstellung einer Zahl als binäre Darstellung einer anderen Zahl, die * bizarr * ist. Für die Mehrzahl der möglichen Argumentwerte ist dies nicht einmal sinnvoll. –

Antwort

1

Ich mag die sinnlose, aber Spaß dezimal codierte binäre (DCB) Darstellung, aber Sie über dieses Engineering. Betrachten Sie die Logik in Ihrer countDigits() Funktion als Basis eines binToDec() und man bekommt etwas viel einfacher wie:

#include <stdio.h> 
#include <math.h> 

unsigned int binToDec(unsigned long number) { 
    unsigned int sum = 0; 

    for (unsigned int i = 0; number > 0; i++, number /= 10) { 
     if (number % 2 != 0) { 
      sum += pow(2, i); 
     } 
    } 

    return sum; 
} 

int main(void) { 

    printf("%u\n", binToDec(101010)); 

    return 0; 
} 

OUTPUT

> ./a.out 
42 
> dc 
2 i 
101010 p 
42 
> 

und eine Eingabe von 10 gibt Ihnen eine Leistung von 2.

+0

Vielen Dank für den Vorschlag. Leider habe ich noch nie Bit-Shifting gelernt oder verwendet, und ich würde lieber keine Operatoren verwenden, die ich in meiner Implementierung nicht kenne. – Kurausukun

+0

@Kurausukun, einfach genug zu reparieren, tauschte '1 << i 'und ersetzt' pow (2, i)', die Sie in Ihrem ursprünglichen Code verwendet haben. – cdlane

Verwandte Themen