2016-09-10 4 views
-3

Ich kodierte heute schnell (mit Hilfe der Suche nach verschiedenen Google-Suchen) nach einer grundlegenden Zuordnung zum Konvertieren von Binär in Dezimal. Dies ist nur der Teil, der in das Zweierkomplement konvertiert wird.Wie konvertiere ich Binär in Dezimal?

void binary_to_decimal (char *value){ 
    int i; 
    int numdigits = strlen(value); 
    int c=0; 
    char nvalue[numdigits]; 
    char sum[numdigits]; 
    char b[numdigits]; 

    for(i=0;i<numdigits;i++)  
     b[i]='0'; 

    b[numdigits-1]='1'; 

    if (numdigits%4==0 && value[0]=='1') { 
     for(i=0;i<numdigits;i++){ 
      if(value[i]=='1') 
       nvalue[i]='0'; 
      else if(value[i]=='0') 
       nvalue[i]='1'; 
    } 

    for(i=0;i<numdigits;i++) 
     printf("%c", nvalue[i]); 

    printf("\n"); 

    for(i=0;i<numdigits;i++) 
     printf("%c", b[i]); 

    printf("\n"); 

    for(i=numdigits-1; i>=0; i--){ 
     nvalue[i]=nvalue[i]-'0'; 
     b[i]=b[i]-'0'; 
     sum[i]=(nvalue[i]^b[i]^c)+'0'; 
     c=(nvalue[i]&b[i]) | (b[i]&c) | (nvalue[i]&c); 
    } 

    if (c!=0) 
     sum[0]=1; 

    for(i=0;i<numdigits;i++) 
     printf("%c", sum[i]); 
    } 
    else { 

    } 

    printf("\n"); 
} 

Natürlich könnte ich es aufräumen, aber das ist nicht das, worüber ich mir Sorgen mache. Das scheint zu funktionieren, aber ich fühle es anders, etwas zum Arbeiten zu bringen und jedes Detail zu verstehen, damit es funktioniert.

Ich würde mich über jede Rückmeldung zu diesem Thema freuen. Werden die Dinge mich einholen?

Ich werde einmal über den Code gehen und versuchen, es zu verstehen, aber jede Hilfe wäre willkommen.

+0

Ich glaube, Sie den Unterschied zwischen ihm immer jedes Detail zu arbeiten und zu verstehen, wie es funktioniert. Sie können Glück haben, etwas zusammen zu hacken. Übrigens solltest du nicht zu oft googeln, wenn du dir Sorgen um Verständnis machst. Finde es selbst heraus und mach dir keine Sorgen um "Schnelligkeit". – ChiefTwoPencils

+3

Ich denke, Sie müssen genauer sein und genau die Linie (n) angeben, die Sie nicht verstehen. BTW: Vielleicht http://codereview.stackexchange.com/ wäre ein guter Platz zum ausprobieren – 4386427

+0

Sie können Tests schreiben, um Ihre Funktionen zu testen. Ich verwende das Prüfrahmenwerk, um mein C zu testen https://libcheck.github.io/check/ –

Antwort

1

Beginnen wir mit der Tatsache, dass dieser Code nichtconvert binary to decimal. Vielleicht meintest du das mit:

Dies ist nur der Teil, der in das Zweierkomplement konvertiert wird.

Mit diesem Code (try to) wird ein Wert negiert, der durch eine Binärzeichenfolge dargestellt wird. Wie:

a = -a; 
    ^
    Negate 

Das Grundprinzip ist:

1) umkehren jedes Bit in der ursprünglichen Binärkette

2) 1 zu dem Ergebnis aus dem ersten Schritt.

Beispiel mit 4 Bit binär:

  0111 (is 7) 

1) Invert: 1000 (is -8) 

2) Add 1: 1001 (is -7) 

So Ihre erste Schleife macht die Invertzucker und die zweite Schleife fügt 1.

Ihr Code ist jedoch falsch. Wenn numdigits%4==0 && value[0]=='1' falsch ist, initialisieren Sie nie nvalue und Ihr Code hat undefiniertes Verhalten (in der zweiten Schleife). Ich kann nicht herausfinden, warum Sie diese if Aussage verwenden. Es sollte nicht da sein. Sie sollten immer die erste Schleife ausführen.

Weiteres - diese Zeilen scheinen seltsam:

} 
else { 

} 

Sie passen kein Eröffnungsstatement.

In Ihrem Code, tun Sie alle Berechnungen '0' und '1'0 und 1 statt nur mit verwenden. Deshalb müssen Sie ständig zwischen ihnen, das heißt

`0` - `0` to convert to a real 0 
`1` - `0` to convert to a real 1 

und

0 + `0` to convert to a `0` (i.e. a printable 0) 
1 + `0` to convert to a `1` (i.e. a printable 1) 

das macht den Code viel komplizierter als nötig konvertieren.

Stattdessen könnte man die Dinge so real 0 und 1 - außer beim Drucken:

// This function negates a binary string by 
// a) Inverting each bit 
// b) Adding 1 to the inverted string 
void negate_binary (char *value){ 
    int i; 
    int numdigits = strlen(value); 
    int c=0; 
    char nvalue[numdigits]; 
    char sum[numdigits]; 
    char b[numdigits]; 

    // Set b to 1, i.e. 00000...0001 
    for(i=0;i<numdigits;i++)  
     b[i]=0; 
    b[numdigits-1]=1; 

    // Invert all bits in the input string 
    for(i=0;i<numdigits;i++){ 
     if(value[i]=='1') 
      nvalue[i]=0; 
     else if(value[i]=='0') 
      nvalue[i]=1; 
     else 
      exit(1); // Illegal input 

    for(i=0;i<numdigits;i++) 
     printf("%c", nvalue[i] + '0'); 

    printf("\n"); 

    for(i=0;i<numdigits;i++) 
     printf("%c", b[i] + '0'); 

    printf("\n"); 

    // Do sum = nvalue + b (i.e. sum = nvalue + 1) 
    for(i=numdigits-1; i>=0; i--){ 
     sum[i]=(nvalue[i]^b[i]^c);      // Add with carry 
     c=(nvalue[i]&b[i]) | (b[i]&c) | (nvalue[i]&c); // Calculate new carry 
    } 

    if (c!=0) 
     sum[0]=1; 

    for(i=0;i<numdigits;i++) 
     printf("%c", sum[i] + '0'); 
    } 
    else { 

    } 

    printf("\n"); 
} 
+0

Ja, ich habe den Teil, der zur Umwandlung von binär in dezimal fortschreitet, nicht einbezogen. Ich habe im Grunde nur den Teil ausgearbeitet, der herausfand, ob es eine negative Bitnummer mit Vorzeichen war, ich benutzte diesen Code (mit Negativ), was mir ein wenig Mühe machte, etwas auszuarbeiten. Mein Ziel in diesem Codesegment war es, jedes Bit zu invertieren und 1 hinzuzufügen. Ich habe eine else-Anweisung, die es grundsätzlich als nicht-signiert für nicht-negative Zahlen behandelt (hier nicht enthalten). Ich glaube nicht, dass ich das richtige Medium benutzt habe, um den Unterschied zwischen dem richtigen Schreiben und dem vollständigen Verständnis zu finden. –

+0

@ C.B. Das ist was du tust (außer dem Fehler, den ich erwähnt habe). – 4386427

+0

@ C.B. - Aber welchen Teil verstehst du nicht? Ist es das "Invert" oder ist es das "Add 1"? – 4386427