Programm: Dezimal in Binär umrechnen



  • danke, kannst du mir noch kurz erklären, was der numerische zahlenwert ist?



  • Oder rekursiv

    void itobin(unsigned int i)
    { 
      if (i == 0) return;
    
      itobin (i/2);
    
      putchar (i%2 + '0');  // printf("%u", i%2 );
    }
    

  • Mod

    Dulfried schrieb:

    danke, kannst du mir noch kurz erklären, was der numerische zahlenwert ist?

    Einfach der Wert einer Zahl. Im Gegensatz zu einer bestimmten Darstellung. Wird komischerweise oft verwechselt.



  • Geht das nicht auch ganz einfach mit den Grundbausteinen, die ich verwendet habe?

    Ich weiß bei euren Lösungen nie was itobin, putchar, usw. sein soll.



  • itobin ist die Funktion die ich da gerade definiert habe.

    Kannst du aus main mit itobin(3); oder itobin(zahl); aufrufen

    Statt putchsr kannst du auch das printf aus dem Kommentar nehmen.
    http://www.cplusplus.com/reference/cstdio/putchar/



  • Dulfried schrieb:

    [...] Ich habe keine ahnung was stderr, getchar, EOF,uint32_t,fputs und putchar sein sollen.

    daher auch das

    Swordfish schrieb:

    *scnr*



  • danke für eure Hilfe!

    könntet ihr mir bitte auch noch verraten, wie ich es schaff den string in seinen numerischen zahlenwert umzurechnen?

    Allerdings verstehe ich nicht, was man davon hat den string überhaupt in seinen numerischen zahlenwert umzurechnen und nicht direkt mit ihm zu rechnen (ist allerdins in der aufgabe vorgeschrieben)


  • Mod

    Dulfried schrieb:

    könntet ihr mir bitte auch noch verraten, wie ich es schaff den string in seinen numerischen zahlenwert umzurechnen?

    Das zeigen die Beispielcodes diverser Nutzer doch bereits.
    http://de.wikipedia.org/wiki/Stellenwertsystem

    Allerdings verstehe ich nicht, was man davon hat den string überhaupt in seinen numerischen zahlenwert umzurechnen und nicht direkt mit ihm zu rechnen (ist allerdins in der aufgabe vorgeschrieben)

    Wie rechnest du denn mit Zeichenketten?



  • ja mit den beispielprogrammen meckert mein compiler immer.

    char eingabe_feld[17];
    int zahl;

    ich muss für die eingabe folgendes benutze: scanf("%c%16s", &zahlentyp, eingabe_feld)

    um dann den numerischen Zahlenwert zu bekommen habe ich folgendes gemacht:
    numwert = eingabe_feld - 48;

    Der compiler streicht mir das = an und "ein wert vom typ char* kann keiner Entität vom vom typ unsigned char zugewiesen werden.



  • numwert = eingabe_feld - 48;

    Du musst schon mit den einzelnen Stellen von eingabe_feld je nach Position und dem Stellenwert je nach gewünschtem zahlentyp (Zahlensystem?) rechnen ...

    Wahrscheinlich ist %c für zahlentyp das falsche Format. Zeig doch mal vollständigen Code!



  • In Erwartung von etwas bashing...
    Ich finde es immernoch "quite cool". :p

    Mit führenden Nullen:

    char line[100] = "\0";
    unsigned ich = 3001;
    unsigned i;
    for( i = 0x8000; i > 0; i >>= 1 )
    	strcat( line, (ich & i) == i ?  "1" : "0" );
    printf( "%s" , line );
    

    EDIT:
    und noch etwas reduzierter:

    strcat( line, ich & i ?  "1" : "0" );
    

    EDIT #2:
    noch übler:

    for( i = 0x8000; i > 1; i >>= 1, strcat( line, ich & i ?  "1" : "0" ) );
    

    EDIT #3 hat leider doch nicht funktioniert. 🙂



  • Ah, ein Crank-Code-Contest ... ich mach mit 😃



  • Swordfish schrieb:

    Ah, ein Crank-Code-Contest ... ich mach mit 😃

    LOL, schaff es printf auch noch in die for-Schleife zu integrieren und du hast den Pokal. 🙂



  • darfs auch putchar() sein? :p

    for( unsigned i = 17; i; putchar( "10"[ !( ich & 1 <<-- i ) ] ) );
    


  • for( i = 0x8000; i; i >>= 1, strcat( line, ich & i ?  "1" : "0" ), i == 1 && printf( "%s", line ) );
    

    macht alles in einer Zeile. 🙂

    EDIT:
    ist eher was für den code obfuscation contest



  • Im Golfen bin ich trotzdem vorn :p

    for( i = 17; i-- || puts( line ); line[ 16 - i ] = "10"[ !( ich & 1 << i ) ] );
    

    // edit: 55 ohne whitespace



  • Kann kein C++ > vor einigen Jahren. Bekomme aber demnächst VS 2013 und dann geht's richtig ab...



  • ähm. das ist C.



  • "10"[ !( ich & 1 << i ) ]
    

    sieht mir schwer nach "ich bin kein Zeh" aus

    Dummerweise funktioniert mein code leider nicht mit z.B. 0x8000.
    Das ärgert mich jetzt aber.

    So geht's:

    for( i = 0x8000; i; strcat( line, ich & i ?  "1" : "0" ), i >>= 1, !i && printf( "%s", line ) );
    

    und ohne führende Nullen.

    for( i = 0x8000; i; strcat( line, ich & i ?  "1" : strlen( line ) ? "0" : "" ), i >>= 1, !i && printf( "%s", line ) );
    

  • Mod

    EOP schrieb:

    "10"[ !( ich & 1 << i ) ]
    

    sieht mir schwer nach "ich bin kein Zeh" aus

    Ist es aber. Das ist kein Lambdaausdruck oder was immer man vielleicht auf den ersten Blick denken mag. Das ist ein Zeichenkettenliteral(Arraytyp) direkt gefolgt von einem Elementzugriff auf eben dieses Literal. Wenn Swordfish wirklich böse wäre, hätte er (!( ich & 1 << i ))[ "10"] oder *("10" + !( ich & 1 << i)) geschrieben, was aber ein paar Zeichen mehr sind (dafür aber nochmal eine Spur obskurer).

    Wobei das Programm bei mit segfaulted. Die Abbruchbedingung muss i-- || puts( line ) < 0 lauten, da puts im Erfolgsfall einen nicht-negativen Wert zurück gibt. Bei meiner Implementierung ist das eine positive Zahl, bei Swordfishs Testsystem anscheinend 0. Da das unnötigerweise zwei Zeichen mehr sind, bietet es sich an, das ganze puts aus der Schleife zu verbannen, so entfallt auch das || .

    PS: !( ich & 1 << i) geht natürlich auch besser als (ich >> i & 1)) und Umdrehen der Zeichen im Literal. So spart man sich das ! .


Anmelden zum Antworten