Prüfen ob eine Zahl das Ergebis einer Potenz zur Basis 2 ist...?
-
Ich möchte oben genanntes tun ^^
Also prüfen, ob eine Zahl der Reihenfolge 2,4,8,16,32,64,... entspricht.
Wie kann ich das einfach und schnell in C machen?
Ich vermute mal, dass das ein ganz einfaches math. Problem ist und ich wieder einmal zu blöd dazu bin
-
Also auf die Schnelle is mir das gerade eingefallen:
bool is2erPotenz(unsigned int zahl) { int count=sizeof(int)*8, i=0, einser=0, nuller=0; for(;i<count;i++) ((1<<i)&zahl)?einser++:nuller++; return einser==1; }
Die Funktion nutzt die Tatsache, dass bei einer (positiven) 2er Potenz genau ein 1er in der Binärdarstellung der Zahl gesetzt sein kann.
-
Aber wäre das schneller als die Triviallösung
for(; abs(zahl)>=2; zahl=zahl/2) if(abs(zahl) == 2) return true; return false;
<-- war jetzt mal schnell runtergetippt
also ohne garantie
-
Hallo,
Ist nicht jede gerade Zahl eine Zahl aus dieser Reihe ?
return (zahl%2) ? false : true;
-
Nein. z.B. 6 oder 10
EDIT: Also was ich suche ist möglichst eine Ein-Zeilen-Lösung. Ist das Prob. nicht mathematisch einfach zu lösen?
-
EnERgYzEr schrieb:
Nein. z.B. 6 oder 10
EDIT: Also was ich suche ist möglichst eine Ein-Zeilen-Lösung. Ist das Prob. nicht mathematisch einfach zu lösen?
Stümmt. Man dabei bin ich das durchgegangen. Is ja auch schon spät. Gibt bestimmt ne Lösung. Frag doch mal im Matheforum.
-
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