Ganze Zahl aufrunden zu 2er-Potenz
-
lookias schrieb:
dat sieht mir irgendwie neu aus besonders das << kenn ich nur von cout
Das ist der Shift-Operator, danach kann man besser googeln als nach "<<"
und ;n ist doch best ein schreibfehler oder?
Nein, er will wohl nichts initialisieren.
-
lookias schrieb:
erklaehr mal bitte:
Solange deine Beiträge so schlecht zu lesen sind, nein. Bitte benutz Satzzeichen und vielleicht sogar Großbuchstaben, lass solche Sachen wie "dat" und "best", sonst tu ich mir das nicht an. Nur so viel: Schreibfehler sind da nicht drin, was du durch Ausprobieren auch rausgefunden hättest.
-
Nun den shift-Operator konnte ich bis jetzt verstehen
und was heisst nun n>>=1 ?
;n ist mir auch net gelaeufig
-
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