Zwei Probleme :D Einmal String in (duodecimal) int umwandeln und int in Binärdarstellung mittels Bitmaske?



  • Sanj3k schrieb:

    Moin 🙂

    Moin!
    Versuch doch mal, Deine eigene Funktion zu schreiben, statt pow() zu benutzen.

    /* int pow12(int i)
       Gibt den Wert 12 "hoch" i zurueck
    */
    int pow12(int i){
      /* codecodecode */
    }
    

    Das ist doch zu schaffen!



  • Übrigens kannst du dein switch vereinfachen.
    Du nutzt die Tatsache aus, dass die Ziffern im ASCII Code hintereinander stehen.
    Wenn du eine Ziffer als Zeichen hast und davon '0' (erste Ziffer im ASCII Code) abziehst, erhälst du die Nummer.
    Das bedeutet, dass du einfach folgendes schreiben kannst:

    if (isnum(duo_zahl[((length-1)-i)])) // wenn Ziffer
       zahl+=(duo_zahl[((length-1)-i)]-'0')*(pow(12,i));
    


  • Vielen Dank besonders an DarkShadow44 alleine wie ich es mir mit dem Switch Case verschlimmbessert habe obwohl wir beide auf das gleiche Ergebnis kommen und sogar ohne Pow 😃

    @Furble Wurble
    Das wäre auch eine Idee gewesen, einfach mal rein zu gucken in der lib was denn pow macht und sich eine eigene Funktion zu schreiben, wobei ich dachte dass der Prof genau den Weg von DarkShadow haben wollte 🙂


  • Mod

    Sanj3k schrieb:

    Das wäre auch eine Idee gewesen, einfach mal rein zu gucken in der lib was denn pow macht und sich eine eigene Funktion zu schreiben, wobei ich dachte dass der Prof genau den Weg von DarkShadow haben wollte 🙂

    Du wirst es doch wohl hin bekommen, eine Potenz zu berechnen, ohne den Code abschreiben zu müssen?

    Letztlich wird die Implementierung von pow in deiner Standardbibliothek vermutlich ziemlich kompliziert sein, weil diese alle möglichen low-level Tricks ausnutzen wird, um auch noch das letzte an Performance heraus zu kratzen. Aber eine ganz naive Implementierung einer Potzenzfunktion ist selbst für Anfänger sehr leicht und in 4 Zeilen oder weniger machbar. 70 Zeichen maximal.



  • 70 Zeichen maximal.

    Ist das eine absichtliche Codegolf-Vorlage? Edit: Ich schätze nicht.


  • Mod

    Arcoth schrieb:

    70 Zeichen maximal.

    Ist das eine absichtliche Codegolf-Vorlage? Edit: Ich schätze nicht.

    Nein, das war bloß fix an den Fingern abgezählt, wie lang eine ganz naive Implementierung ist, plus ein bisschen Extra, da man als Anfänger vielleicht auch mal foo = foo * 12 statt foo *= 12 schreibt. Ich will's aber nicht vormachen, das soll der Threadersteller mal schön selber machen.

    Wir können natürlich eine Runde Codegolf versuchen, auch wenn das Problem nicht sehr spannend ist. Also Aufgabe:

    int pow12(int i)
    {
      // gibt 12 hoch i zurück
    }
    

    Sprache: C11, freestanding Implementation (also kein pow-Aufruf!). Sind unportable Tricks erlaubt? Ich sag mal ja, da es die Kreativität fördert. Aber ich glaube nicht, dass das Problem viel hergibt:

    return i?12*pow12(i-1):1;
    

    Das sind 25 Zeichen.



  • !i||(pow12(i-1),r*=12);
    

    23 Zeichen, wenn man die Definition der globalen Variable r nicht mitzählt.
    Man braucht kein return-Statement weil unter gccs calling conventions, eax zurückgegeben wird und das enthält die letzte Berechnung, im Fall i == 0, also !i, d.h. 1, ansonsten r*=12, also das gewünschte Ergebnis.


  • Mod

    Nathan schrieb:

    !i||(pow12(i-1),r*=12);
    

    23 Zeichen, wenn man die Definition der globalen Variable r nicht mitzählt.
    Man braucht kein return-Statement weil unter gccs calling conventions, eax zurückgegeben wird und das enthält die letzte Berechnung, im Fall i == 0, also !i, d.h. 1, ansonsten r*=12, also das gewünschte Ergebnis.

    Der Code funktioniert aber nur einmal, außer du setzt r wieder auf 1. Und dann bist du wieder auf > 25 Zeichen.

    edit: Ich habe natürlich nicht spezifiziert, dass die Funktion mehrmals aufrufbar sein soll. Insofern: Cleveres Ausnutzen der Regellücke 👍

    edit2: Eine offensichtliche Verbesserung: !i|| wird zu i&&

    edit3: Ich hatte auch schon an ein Ausnutzen dieser Eigenart des GCC gedacht, wusste aber nicht, dass ein einfacher Ausdruck nicht reicht und daher hat mein Versuch nicht geklappt (Das Ergebnis wurde anscheinend nirgends gespeichert oder der Ausdruck ganz wegoptimiert). Aber mit dieser Vorgabe bekomme ich es richtig hin:

    int pow12(int i)
    {
      i=i?12*pow12(i-1):1;  // 20 Zeichen, ganz ohne Geschummel mit globalen Variablen
    }
    


  • SeppJ schrieb:

    edit2: Eine offensichtliche Verbesserung: !i|| wird zu i&&

    Oh, ja. edit: geht nicht, da sonst 0 in eax und nicht 1.

    edit3: Ich hatte auch schon an ein Ausnutzen dieser Eigenart des GCC gedacht, wusste aber nicht, dass ein einfacher Ausdruck nicht reicht und daher hat mein Versuch nicht geklappt (Das Ergebnis wurde anscheinend nirgends gespeichert oder der Ausdruck ganz wegoptimiert).

    Ja, fiel mir nach dem Posten auch auf, dass man einfach deine Lösung ohne return nehmen könnte.
    Nichtdestotrotz ist meine cooler. Kommaoperator + short circuit ausnutzen.


  • Mod

    Nathan schrieb:

    Ja, fiel mir nach dem Posten auch auf, dass man einfach deine Lösung ohne return nehmen könnte.

    Nein, eben gerade nicht. Ich weiß nicht genau, warum, aber es funktioniert nicht. Ich muss i= davor schreiben, damit es geht.


Anmelden zum Antworten