Aloha!
Voghdzuyin!
Wieso denn Bahnhof? ;-)
Meine Postings fangen (fast) immer mit »Hallo!« an; nur die Sprache wechselt. ;-)
Anscheinend liest der OP nicht mehr mit, er war ja schon gestern mit ceil(log($xx, 2)) als Test auf Zweierpotenzen zufrieden. Das hält uns aber nicht davon ab, noch bessere Lösungen zu finden, gelle :-)
Jetzt macht's ja erst richtig Spaß! ;-) Und wir wollen doch am Ende die beste Lösung im Archiv haben. <offtopic>Das Archiv ist überhaupt super: Seit ca. 3 Jahren finde ich so zuverlässig Antworten auf alle meine Fragen, daß ich noch nie einen eigenen Thread starten mußte. :-)</offtopic>
Dein Ansatz ist sicher bis jetzt der einfachste.
Das war das Ziel.
Wenn es auf Performance ankommt, ist [...]
aber wohl kaum zu schlagen. Habe das in JavaScript umgesetzt und ausprobiert: Funktioniert einwandfrei. Für PHP habe ich jetzt leider keine Testmöglichkeit.
Ich widerspreche nur ungern, aber die Aussage kam mir komisch vor. Meine Schleife enthält nur einen Vergleich, einen Bitshift und eine Zuweisung. Deine enthält eine Subtraktion, eine Addition, ein bitweises Und, eine Negation, einen Bitshift und zwei Zuweisungen. Beide brauchen, wenn ich das richtig sehe, log₂($n) Durchläufe.
Also habe ich mal in PHP die Zeiten gemessen, und zwar wie folgt: In einer for-Schleife wird $n von 1 bis 60000 hochgezählt (die 60000 ist Willkür; ich habe es auch mit 20000 und mit 15 probiert) und mit jedem $n die Funktion aufgerufen. Das Ergebnis wird $v zugewiesen, aber nicht weiter verarbeitet.
Ergebnisse von 5 Script-Aufrufen (in sec):
Don P: 0.44359087944
Længlich: 0.278346061707
Don P: 0.409577131271
Længlich: 0.289813995361
Don P: 0.392857074738
Længlich: 0.295516967773
Don P: 0.398221969604
Længlich: 0.284239053726
Don P: 0.409832954407
Længlich: 0.280338048935
Dann habe ich noch versucht, Deine Prüfung (if (!(($n - 1) & $n)) return $n;
) in meine Funktion einzubauen, um gelegentlich die Schleife ganz einzusparen. Davon wurde es interessanterweise aber auch langsamer (lag in der Größenordnung 0.30 bis 0.33).
Hast Du in Javascript die Zeit gemessen? Sah das da anders aus?
Viele Grüße vom Længlich