725 Stimmen

Wie prüft man, ob eine Zahl eine Potenz von 2 ist?

Heute brauchte ich einen einfachen Algorithmus, um zu prüfen, ob eine Zahl eine Potenz von 2 ist.

Der Algorithmus muss sein:

  1. Einfach
  2. Richtig für jede ulong Wert.

Ich habe mir diesen einfachen Algorithmus ausgedacht:

private bool IsPowerOfTwo(ulong number)
{
    if (number == 0)
        return false;

    for (ulong power = 1; power > 0; power = power << 1)
    {
        // This for loop used shifting for powers of 2, meaning
        // that the value will become 0 after the last shift
        // (from binary 1000...0000 to 0000...0000) then, the 'for'
        // loop will break out.

        if (power == number)
            return true;
        if (power > number)
            return false;
    }
    return false;
}

Aber dann dachte ich: Wie wäre es zu prüfen, ob log 2 x ist eine genau runde Zahl? Als ich für 2^63+1 geprüft habe, Math.Log() ergab aufgrund der Rundung genau 63. Ich habe also überprüft, ob 2 hoch 63 gleich der ursprünglichen Zahl ist, und das ist der Fall, denn die Berechnung erfolgt in double s und nicht in genauen Zahlen.

private bool IsPowerOfTwo_2(ulong number)
{
    double log = Math.Log(number, 2);
    double pow = Math.Pow(2, Math.Round(log));
    return pow == number;
}

Dieses Ergebnis true für den angegebenen falschen Wert: 9223372036854775809 .

Gibt es einen besseren Algorithmus?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X