Binärrechner



  • Hey Leute

    Ich habe mich bezüglich einer Frage in diesem Forum angemeldet
    Und zwar folgendens:

    Ich hab als Aufgabe für die Uni ein Programm zu schreiben was eine Dezimalzahl in eine Binärzahl umwandelt. Es hat auch so weit funktioniert.
    Die Ausgabe lautet bei mir Beispielsweise: Dezimalzahl:10

    Ausgabe: 00000000000000000000000000001010

    Die Vorgabe lautet aber, dass der Binärcode in 8 bitblöcke unterteilt werden soll:
    also 00000000|00000000|00000000|00001010

    Das hat bei mir aber nicht hin 😞 Wär toll wenn einer eine Idee hat

    Hier der Code:

    #include <stdio.h>

    int main()
    {
    unsigned int value,i,bin[32];
    printf("Please enter an integer:");
    scanf("%d",&value);

    for(i=0;i<32;i++)
    {
    bin[i]=((value>>i)&1);

    }

    //Schleife für umgekehrte Ausgabe
    for(i=0;i<32;i++)
    {

    printf("%d",bin[31-i]);
    }

    printf("\n");
    return 0;
    }

    mfg Gerald



  • Ich habe mich bezüglich einer Frage in diesem Forum angemeldet

    Na dann: herzlich willkommen!

    Die Vorgabe lautet aber, dass der Binärcode in 8 bitblöcke unterteilt werden soll:
    also 00000000|00000000|00000000|00001010

    Also nur für die Ausgabe? Da reicht ein Zähler, der alle 8 Zeichen wieder auf Null gesetzt wird, wenn ein Trennzeichen ausgegeben werden sollte.

    Bitte schreib vor deinen Code [cpp] und danach [/cpp], das erhöht die Lesbarkeit.



  • Herzlich willkommen,

    bin selbst nicht der große C-Kenner aber probiere es mal so:

    #include <stdio.h>
    
    int main()
    {
    
      unsigned int value, i;
      printf("Please enter an integer:");
      scanf("%d",&value);
    
      for( i=32; i>0; --i)
      {
        if ( !(i % 8) ) printf("|");
        printf("%d",( (value>>(i-1)) &1));
      }
    
      printf("\n");
    
      return 0;
    }
    


  • Danke hat super funktioniert.

    kann man auch das erste "|" Zeichen ausblenden? Bin noch blutiger Anfänger in C 🙂
    Wenn nich macht auch nix ...

    glg



  • gerald123 schrieb:

    Danke hat super funktioniert.

    kann man auch das erste "|" Zeichen ausblenden? Bin noch blutiger Anfänger in C 🙂

    Am wenigsten Schreibarbeit macht es wohl, eine Ausnahme für den Fall hinzuzufügen, daß i 32 ist. Aber wenn du das nicht selbst siehst: wieso bedankst du dich dann bei jemandem, der dir nichts erklärt hat?



  • ^^oder z.b. so:

    void show_int (int i)
    {
        show_byte (i>>24);
        putchar ('|');
        show_byte (i>>16);
        putchar ('|');
        show_byte (i>>8);
        putchar ('|');
        show_byte (i);
    }
    

    musst nur noch 'show_byte' programmieren, d.h. eine funktion die 8 bits ausgibt.
    🙂



  • gerald123 schrieb:

    Danke hat super funktioniert.

    kann man auch das erste "|" Zeichen ausblenden? Bin noch blutiger Anfänger in C 🙂
    Wenn nich macht auch nix ...

    glg

    Wie mein Vorredener schon ausführte ist eine weitere Bedingung in der If-Abfrage der einfachste Weg das erste Trennzeichen wegzubekommen, das sollte dann so funktionieren:

    #include <stdio.h>
    
    int main()
    {
    
      unsigned int value, i;
      printf("Please enter an integer:");
      scanf("%d",&value);
    
      for( i=32; i>0; --i)
      {
        if ( !(i % 8) & i < 32 ) printf("|");
        printf("%d",( (value>>(i-1)) &1));
      }
    
      printf("\n");
    
      return 0;
    }
    

    Es tut mir leid dass ich nix erklärt habe, aber da der erste Code von ihm stammte und ich nur leichte Modifikationen vorgenommen habe ist der verwendete Algorithmus gleich geblieben. Gut eine unnötige Schleife habe ich noch wegoptimiert...

    Mit dem Ausdruck !(i % 😎 prüfe ich nur noch ob die aktuelle Stelle durch 8 teilbar ist oder wie hier implementiert der Rest einer Modulo-Operation mit 8 ergibt keinen Rest.

    Hmm wenn noch was unklar sein sollte frag einfach, dazu ist ein Forum da. Und keine Angst ein RTFM oder such in Google wirste von mir nie bekommen, denn dadurch entsteht ein Teufelskreis weil man dann genau so einen Eintrag bei Google findet indem dann steht "such in Google". 😉



  • Wie mein Vorredener schon ausführte ist eine weitere Bedingung in der If-Abfrage der einfachste Weg das erste Trennzeichen wegzubekommen, das sollte dann so funktionieren:

    Gar nicht wahr. Hatte nur gesagt, dass man so am wenigsten Tippen muss. fricky hat sich zB die drei unnötigen Vergleiche auf 32 gespart. Das ist, arguably, einfacher.



  • Ganz entspannt 😉
    Die Lösung mit der Abfrage ist wohl eine der einfachsten, wenn man den Ursprungscode übernimmt. Die Lösung von Fricky ist klar einfacher, aber hat nix mehr mit dem Grundcode von Gerald zu tun.



  • Wie der Code von justchris funktioniert war mir eigentlich schon klar, aber trotzdem danke 🙂 das ist halt viel geschickter gelöst als mit arrays 😉



  • Könnte jmd die Zeile 13 von justchris bitte genau erklären? Und warum man genau mit der Bitmaske 1 verlgeicht?
    Wäre nett! Danke schon mal 🙂



  • Du meinst

    value>>(i-1)) &1
    

    ?

    Hier wird der Value um (i-1) Bits nach rechts verschoben, so daß das aktuell benötigte Bit dann an Bitposition 0 steht.
    Und die Ver'und'ung mit 1, damit nur dieses Bit erhalten bleibt (alle größeren Bits werden dann auf 0 gesetzt), so daß dann nur noch 0 oder 1 ausgegeben wird.


Anmelden zum Antworten