andere lösung für schleife



  • Hallo zusammen,

    mich würde mal interessieren, ob der folgende Codeabschnitt von mir nicht vielelicht anders gelöst werden kann, z.B. mit einem Logarithmus.

    int var1 = 0;
    int var2 = 34816;
    
    while(var2 > 1) {
      var1 += 1;
      var2 /= 2;
    }
    

    Ich weiß alerdigns nicht ob meine Lösung dazu stimmt.

    Denn eigentlich müsste, wenn man eine Rechnung macht diese ja so aussehen:

    34816 / 2^x = 1
    

    Berechnung wie ich es machen würde:

    lg(20000) = lg(2^x)
    lg(20000) = x*lg(2)
    x = lg(20000)/lg(2)
    

    Das x am Schluss dann noch abrunden.


  • Mod

    Es würde helfen, wenn du sagen würdest, was du überhaupt machen willst. Sonst kriegst du nämlich nur nutzlose Tipps wie diesen hier:

    int var1 = 0;
    int var2 = 34816;
    
    while(var2 > 1) {
      var1 += 1;
      var2 /= 2;
    }
    

    ist äquivalent zu:

    int var1 = 15;
    int var2 = 1;
    

    Ein guter Compiler wird da möglicherweise sogar schon zur Compilezeit drauf kommen und entsprechend optimieren.



  • SeppJ schrieb:

    Es würde helfen, wenn du sagen würdest, was du überhaupt machen willst. Sonst kriegst du nämlich nur nutzlose Tipps wie diesen hier:

    int var1 = 0;
    int var2 = 34816;
    
    while(var2 > 1) {
      var1 += 1;
      var2 /= 2;
    }
    

    ist äquivalent zu:

    int var1 = 15;
    int var2 = 1;
    

    Ein guter Compiler wird da möglicherweise sogar schon zur Compilezeit drauf kommen und entsprechend optimieren.

    Diese Äquivalenz ist mir natürlich klar. Aber ich brauche ja keine konstanten Werte sondern will eben berechnen wie viele Durchläufe bei der Teilung durch 2 benötigt werden.

    Das wollte ich jetzt halt einfach etwas schneller durch die Berechnung lösen und wissen ob diese Berechnung von mir richtig ist.

    Die Werte, die ich den Veriablen geben habe sollen nur zur veranschaulichung sein. Später bekomme ich den Vert für die "var2" dann aus einer Funktion als Rückgabewert zurück.


  • Mod

    Ich glaube die 100 Prozessortakte die dein Schleifchen braucht (wenn es sich nicht schon um Compilezeitkonstanten handelt und dadurch wegoptimiert wird), sind nicht so schwerwiegend gegenüber der Zeit die das Ausrechnen von Logarithmen braucht. Das dürfte beides ungefähr gleich lange dauern.

    Aber eine direkte Lösung mit Logarithmen fällt mir sowieso nicht ein, weil ich mich schwer tue, die Integerdivision richtig umzurechnen.


Anmelden zum Antworten