Prüfen ob eine Zahl das Ergebis einer Potenz zur Basis 2 ist...?



  • Hallo,

    eine in der "C/C++-Welt" bekannte Funktion/Operation liefert, ob eine Potenz zur Basis zwei vorliegt:

    int isPowerOf2(unsigned long x) {  return !((x-1)&x);}
    

    😉

    MfG



  • Eine Zahl ist in der Form 2^n, wenn nur ein Bit gesetzt ist. Am fixesten ginge das wohl, indem man eine Funktion baut, die die Bits eines Bytes zaehlt (per lookup-Tabelle mit 256 Eintraegen). Fuer ein 32bit-integer musst Du dann die Anzahl der gesetzten Bits der 4 Bytes zusammenaddieren; kommt 1 raus ist es aus 2^n. (Negative Zahlen muessen vorher abgefangen werden).
    Edit: Verdammt 🙂



  • Probe-Nutzer schrieb:

    Hallo,

    eine in der "C/C++-Welt" bekannte Funktion/Operation liefert, ob eine Potenz zur Basis zwei vorliegt:

    int isPowerOf2(unsigned long x) {  return !((x-1)&x);}
    

    😉

    MfG

    Fast. Da hast du x==0 vergessen. Besser:

    int isPowerOf2(unsigned long x) {  return !((x-1)&x) && x;}
    


  • Taurin schrieb:

    Da hast du x==0 vergessen.

    nö, habe ich nicht vergessen, sondern scharf aus der Fragestellung des Originalposters entnommen, daß er diesen Fall nicht benötigt oder vorher schon ausgeschlossen hat, und die Funktion deswegen umzubenennen a là

    isPowerOf2AndNotNull

    wollte ich dann doch nicht 🙂

    MfG



  • Ich weiß zwar nicht, wie du rausgefunden hast, was EnERgYzEr wollte, aber wenn du
    das sagst...

    edit: Und ausserdem müsste deine Funktion isPowerOfTwoOrNull() heißen :p



  • Taurin schrieb:

    Ich weiß zwar nicht, wie du rausgefunden hast, was EnERgYzEr wollte, aber wenn du
    das sagst...

    edit: Und ausserdem müsste deine Funktion isPowerOfTwoOrNull() heißen :p

    zitat: "Also prüfen, ob eine Zahl der Reihenfolge 2,4,8,16,32,64,... entspricht."
    ist da die 0 drin?

    und vor allem ging es drum, den trick zu zeigen, auf di speziele anwendung wird EnERgYzEr die sache eh anpassen.



  • Probe-Nutzer schrieb:

    daß er diesen Fall nicht benötigt oder vorher schon ausgeschlossen hat

    genau so ist es! Und vielen Dank für die Lösung!!! 🙂



  • Was Volkard uns gerade sagen wollte, versteh ich nicht, aber offensichtlich
    ist EnERgYzEr zufrieden. Das reicht. Und kann ich auch aufhören, Haare zu spalten. 😉



  • Eine Lösung scheint zwar schon gefunden zu sein, aber habt ihr schon mal über die Möglichkeiten des Logarythmus' (LOG) nachgedacht? (schließlich ist was mathematisches gesucht worden ;))



  • AJ schrieb:

    Eine Lösung scheint zwar schon gefunden zu sein, aber habt ihr schon mal über die Möglichkeiten des Logarythmus' (LOG) nachgedacht? (schließlich ist was mathematisches gesucht worden ;))

    Daran hatte ich auch zuerst gedacht, aber der Logarithmus liegt bei mir schon wieder so lange zurück, dass ich da nicht mehr die Lösung gefunden habe 😞

    Aber die gefundene Lösung ist wohl eh wesentlich schneller und kürzer 👍



  • Naja, normalerweise hätte ich auch gesagt ich errechne das Ergebnis aus dem Logarythmus der Basis 2 mit dem gegebenen Wert und vergleiche dann, ob das Ergebnis eine Ganzzahl ist. Wenn es so ist, dann wäre der gegebene eine Potenz der Basis 2. Leider hab ich aber keine entsprechende Funktion in der math.h gefunden, die das kann 😞 (wovon ich eigentlich ausgegangen wäre)



  • ist auch nicht notwendig der natürliche logarithmus reicht völlig aus....

    wenn du z.b. den dualen logarithmus von 8 (was ja bekanntlich 3 ist) ausrechnen willst geht das auch so ln(8)/ln(2)...

    wobei man hier ja rundungsfehler bekommen kann und dann lieber auf ne epsilonumgebung vergleichen sollte ob die zahl eine potenz von 2 ist... ist dem fall ist es also unter umständen sinnvoll einen ganzzahllog zu implementieren


Anmelden zum Antworten