Dezimalzahl in Binärzahl umwandeln.



  • Was ich immer noch nicht verstehe ist wie ich die Bitoperation in mein Code einfügen soll. a ist eine beliebige Zahl a = a & 0b11111111. Wie regel ich denn die Ausgabe dann?



  • Du darfst (in diesem Fall) in der Bitmaske nur ein Bit auf 1 haben.

    Du vergleichst, ob beim Verunden 0 raus kommt. Dann gibst du ein '0' aus.
    Sonst eine '1'



  • Problem ist immer noch dass ich die Zahlen noch umdrehen muss in der Ausgabe. Wie kriege ich dies denn hin?

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        unsigned short a;
        printf("Wert");
        scanf("%hu",&a);
        printf("%hu\n",a);
        printf("%x\n",a);
    
    while(a!=0)
    {
    
    if(a & 0b00000001)
    {
        printf("1");
    
    }
    
        else
    {
        printf("0");
    }
       a=a/2;
    
    }
    
        return 0;
    }
    


  • Im Augenblick maskierst du das niedrigste Bit und schiebst den Wert darüber.
    Das muss so aber nicht sein.
    Man kann auch die Maske schieben.



  • Kannst du mir ein beispiel zeigen wie ich die Maske schieben soll?



  • Ich habs mal versucht, aber es scheint noch ein fehler zu haben.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        unsigned short b=0b00000001,a;
        printf("Wert");
        scanf("%hu",&a);
        printf("%hu\n",a);
        printf("%x\n",a);
    
    while(a!=0)
    {
    
    if(a & 0b10000000)
    {
        printf("1");
    
    }
    
        else
    {
        printf("0");
    }
       a=a/2;
       b= b >> 1;
    
    }
    
        return 0;
    }
    

  • Mod

    muster >> x; verschiebt ein Bitmuster um x Binärstellen nach rechts und muster << x; um x nach links. Du kannst natürlich auch die Kurzschreibweise benutzen:

    maske >>= x;
    // anstatt
    maske = maske >> x;
    

    Reicht dir das als Hinweis, wenn du das in diesem Thread (hoffentlich) gelernte Wissen anwendest und musst du genauer wissen, was du wann um wie viele Stellen verschieben musst?



  • sry hab mich verschrieben

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        unsigned short b=0b10000000,a;
        printf("Wert");
        scanf("%hu",&a);
        printf("%hu\n",a);
        printf("%x\n",a);
    
    while(a!=0)
    {
    
    if(a & b)
    {
        printf("1");
    
    }
    
        else
    {
        printf("0");
    }
       a=a/2;
       b= b >> 1;
    
    }
    
        return 0;
    }
    


  • Gib's mit dem Programmieren einfach auf. Du hast ja nicht mal hinbekommen, c print bitmask auch nur einmal zu googlen und dir dort ein paar Codebeispiele anzuschauen. Und auch nach drei Seiten hast du immer noch beschissene Formatierung.

    Lass es einfach sein. Werd' Altenpfleger oder sowas, da sparst du uns und dir Zeit mit, und der Job ist sogar gefragt.



  • Du veränderst ja auch jetzt noch in jedem Schleifendurchgang die Variable a!
    Und die Schleifenbedingung mußt du auch anpassen (auf "b > 0").



  • Mach das Verfahren erstmal mit zwei Blatt Papier und Bleistift.

    Und überleg mal, was passiert, wenn du 1 nach rechts schiebst.
    Und überleg mal, was bei a=a/2; mit a passiert.
    Das Ganze in Binärdarstellung.

    Tipp: Der Windows-Rechner kennt auch eine Darstellung für Programmierer.



  • Hab ich noch ein Fehler?

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    unsigned short b=0b10000000,a;
    printf("Wert");
    scanf("%hu",&a);
    printf("%hu\n",a);
    printf("%x\n",a);
    
    while(b>0)
    {
    if(a & b)
    {
    printf("1");
    }
    else
    {
    printf("0");
    }
    b= b >> 1;
    }
    return 0;
    }
    


  • Ist es möglich zwischen 4 Bit Blöcke ein Leerzeichen einzubauen?



  • Gandolf schrieb:

    Hab ich noch ein Fehler?

    Reichen 8 Bit?
    Ein short hat mindestens 16 Bit

    Dein Einrückungsstil ist Scheiße.

    printf für einzelne Zeichen ist Overkill. (Aber das kann der Compiler optimieren)

    Gandolf schrieb:

    Ist es möglich zwischen 4 Bit Blöcke ein Leerzeichen einzubauen?

    Bei der Ausgabe?
    Ja.
    Mitzählen.



  • ich hab es zu 16 Bit umgewandelt.

    Wie würde die alternative mit printf aussehen?

    Die Leerzeichen sollen in der Ausgabe passieren. Ist dies nicht möglich?


  • Mod

    Gandolf schrieb:

    Wie würde die alternative mit printf aussehen?

    putchar.

    Die Leerzeichen sollen in der Ausgabe passieren. Ist dies nicht möglich?

    Bitte ein Minimum an Textverständnis anwenden:

    DirkB schrieb:

    Gandolf schrieb:

    Ist es möglich zwischen 4 Bit Blöcke ein Leerzeichen einzubauen?

    Bei der Ausgabe?
    Ja.
    Mitzählen.

    Wie liest du daraus, dass es bei der Ausgabe nicht möglich sein solle?



  • Gandolf schrieb:

    Wie würde die alternative mit printf aussehen?

    int main()
    {
         for() //int i von sizeof(zahl) bis 0 herunterzählen
         {
              ziffer = //zahl verschoben um i stellen binär verknüpft mit 1
              printf("%d", ziffer);
         }
    }
    

    übrigens auch deutlich kürzer als dein programm.

    Die Leerzeichen sollen in der Ausgabe passieren. Ist dies nicht möglich?

    du baust in der for-schleife noch eine if-abfrage ein, die überprüft, ob bereits 4 ziffern geschrieben wurden und dann evtl. ein leerzeichen schreibt.

    ps: wenn du dir ein lehrbuch kaufst, das weniger die tollen neuen sprachelemente und mehr die programmierung an sich (sozusagen am beispiel von c) vermittelt, kannst du dir das auch direkt anlesen und brauchst dich nicht so blöde anmachen zu lassen.



  • HansKlaus schrieb:

    Gandolf schrieb:

    Wie würde die alternative mit printf aussehen?

    int main()
    {
         for() //int i von sizeof(zahl) bis 0 herunterzählen
         {
              ziffer = //zahl verschoben um i stellen binär verknüpft mit 1
              printf("%d", ziffer);
         }
    }
    

    Alternative heißt etwas Anderes als das Ursprüngliche.
    In diesem Fall kein printf . 👎

    HansKlaus schrieb:

    übrigens auch deutlich kürzer als dein programm.

    Aber auch falsch.
    Denn sizeof liefert einen anderen Wert als du dafür brauchst. 👎

    HansKlaus schrieb:

    Die Leerzeichen sollen in der Ausgabe passieren. Ist dies nicht möglich?

    du baust in der for-schleife noch eine if-abfrage ein, die überprüft, ob bereits 4 ziffern geschrieben wurden und dann evtl. ein leerzeichen schreibt.

    Das bedeutet "mitzählen"



  • DirkB schrieb:

    Alternative heißt etwas Anderes als das Ursprüngliche.
    In diesem Fall kein printf . 👎

    hmmm so spät ist es doch noch gar nicht.

    Denn sizeof liefert einen anderen Wert als du dafür brauchst. 👎

    stimmt. und jedes mal sizeof aufzurufen ist auch doof, da sich die größe ja nicht so schnell ändern wird. also vorher einmal sizeof und das ergebnis dann multipliziert mit 8 in einer variablen speichern. 🙄
    es ist dann aber trotzdem noch kürzer.

    Das bedeutet "mitzählen"

    und warum sollte ich dann rumpampen, wenn ich den eindruck habe, dass das wort "mitzählen" doch nicht so klar verständlich ist?



  • sizeof wird nicht zur Laufzeit berechnet.
    Daher ist es egal wie oft du das schreibst.

    Und wenn du schon sizeof nimmst, ist 8 die falsche Wahl. Da nimmt man dann CHAR_BIT aus <limits.h>
    Das ist zwar sehr, sehr häufig 8. Muss es aber nicht.


Anmelden zum Antworten