So überprüfen Sie, ob eine Zahl eine Leistung von 2 ist
Posted: 25 Feb 2025, 20:20
Heute brauchte ich einen einfachen Algorithmus zur Überprüfung, ob eine Zahl eine Leistung von 2 ist. < /p>
Der Algorithmus muss sein: /> [*] Einfach
[*] Richtig für einen beliebigen Ulong Wert.
Ich habe mich ausgedacht das einfach Algorithmus: < /p>
Aber dann dachte ich: Wie wäre es, wenn Protokoll 2 x genau eine runde Zahl ist? Als ich nach 2^63+1 checkte, gab Math.log () aufgrund der Rundung genau 63 zurück. Also habe ich überprüft, ob 2 zur Power 63 gleich der ursprünglichen Zahl ist und es ist, da die Berechnung in Double s und nicht in genauen Zahlen erfolgt.
Dies gab true für den angegebenen falschen Wert zurück: 9223372036854775809 .
Gibt es einen besseren Algorithmus?
Der Algorithmus muss sein: /> [*] Einfach
[*] Richtig für einen beliebigen Ulong Wert.
Ich habe mich ausgedacht das einfach Algorithmus: < /p>
Code: Select all
private bool IsPowerOfTwo(ulong number)
{
if (number == 0)
return false;
for (ulong power = 1; power > 0; power = power number)
return false;
}
return false;
}
Code: Select all
private bool IsPowerOfTwo_2(ulong number)
{
double log = Math.Log(number, 2);
double pow = Math.Pow(2, Math.Round(log));
return pow == number;
}
Gibt es einen besseren Algorithmus?