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