Ganze Zahl aufrunden zu 2er-Potenz



  • 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