Ganze Zahl aufrunden zu 2er-Potenz



  • lookias schrieb:

    und was heisst nun n>>=1 ?

    Analog zu (a+=2) == (a=a+2) heißt das n=n>>1.

    ;n ist mir auch net gelaeufig

    Naja, for-Schleifen sehen so aus:

    for (initialisierung; bedingung; durchlaufaktion)
    

    Wenn Du nichts initialisieren möchtest, dann schreibst Du einfach

    for (;bedingung; durchlaufaktion)
    


  • Gut ok danke, hatte das Komma uebersehen.

    ++i,n>>=1
    

    Also das mit dem Komma hab ich auch noch nie gesehen,

    ist das so Konvention fuer for Schleifen oder wo kann man das noch machen?

    Wird n irgendwie false wenn man es lang genug durch 2 teilt, oder ebend die bits verschiebt?



  • Es wird irgendwann 0 und das bedeutet false.



  • lookias schrieb:

    Also das mit dem Komma hab ich auch noch nie gesehen,

    Das ist der Komma-Operator.



  • Danke vielmals ich muss doch immer wieder feststellen, wie wenig ich doch kann 😞

    Ich denke auch, dass MFK's Loesung die Bessere ist, da meine ja schliesslich das Selbe bedeutet, als wenn man die 2 solange potenziert bis man ueber n liegt. 😉



  • lookias schrieb:

    Danke vielmals ich muss doch immer wieder feststellen, wie wenig ich doch kann 😞

    Das würde ich als gutes Zeichen deuten. Solange man das noch merkt, kann man lernen. 🙂

    Ich denke auch, dass MFK's Loesung die Bessere ist, da meine ja schliesslich das Selbe bedeutet, als wenn man die 2 solange potenziert bis man ueber n liegt. 😉

    Sie hat aber gegenüber der Aufgabenstellung noch ein Obiwanproblem, denn bei einer Zweierpotenz als Eingabewert sollte derselbe Wert rausgegeben werden. Meine Funktion gibt die nächste Zweierpotenz aus.



  • Wenn es vor allem darum geht, daß die Lösung effizient ist könnte man auch folgendes machen:

    der bsr-Befehl (Assembler) sagt einem das größte gesetzte Bit.

    Also müßte man einfach nur 1<<r liefern, wobei r der Wert sein sollte, den bsr liefert. Jetzt fehlt nur noch der Fall, daß die eingegebene Zahl schon eine Zweierpotenz ist. Das kann man aber leicht abfangen, denn:

    x ist 2er-Potenz <=> x & (x-1) == 0

    Dann kommt man ohne schleifen aus, auch wenn man auf Grund des inline-Assemblers nicht mehr so schön portabel ist. Läßt sich aber vielleicht mit nem ifdef lösen und je nach Anwendungsfall bringt's vielleicht was.

    MfG Jester



  • Effizenz muss nicht sein, Portabilität auch nicht.
    Bloß ältere Grafikkarten vertragen nur diese Texturgrößen, dafür brauch ichs.

    if (x & (x-1)) ...
    

    Genial!

    Den werd ich mal mit MDKs Lösung kombinieren.



  • #include <iostream>
    using namespace std;
    
    typedef unsigned int u32;
    
    u32 floorLog2(u32 x){
    	//diese hier ist fein mit inline-asm dekorierbar
    	u32 r=0;
    	while(x/=2)
    		++r;
    	return r;
    }
    
    u32 ceilLog2(u32 x){
    	if(x<=1) return 0;
    	return floorLog2(x-1)+1;
    }
    
    int main(){
    	for(u32 i=0;i<16;++i)
    		cout<<i<<' '<<floorLog2(i)<<' '<<ceilLog2(i)<<endl;
    }
    


  • Wenn du nur bis kleiner 2 testest kannst du, um einen schritt schneller sein

    musst aber ++r uebergeben 😉


Anmelden zum Antworten