Heim >Backend-Entwicklung >C++ >Wie können wir effizient feststellen, ob eine Zahl eine Leistung von 2 ist?

Wie können wir effizient feststellen, ob eine Zahl eine Leistung von 2 ist?

Barbara Streisand
Barbara StreisandOriginal
2025-01-29 19:21:10989Durchsuche

How Can We Efficiently Determine if a Number is a Power of 2?

Bestimmen Sie, ob eine Anzahl von Zahlen 2

ist

Problembeschreibung

Bestimmen Sie, ob die angegebene Zahl die Leistung von 2 ist, was einen einfachen und genauen Algorithmus erfordert. Der Autor schlägt zwei Algorithmen vor, tritt jedoch bei der Verwendung der Berechnung von Zahlen auf das Problem auf.

Der erste Algorithmus

Der erste Algorithmus Verwenden Sie einen einfachen Zyklus, um die Leistung von 2 durch die Verschiebung zu überprüfen:

Diese Methode ist einfach und leicht zu verstehen und kann perfekt für jeden IsPowerOfTwo -Wertzustands ausgeführt werden.

<code class="language-c#">private bool IsPowerOfTwo(ulong number)
{
    if (number == 0)
        return false;

    for (ulong power = 1; power > 0; power = power << 1)
    {
        if (power == number)
            return true;
        if (power > number)
            return false;
    }
    return false;
}</code>
Der zweite Algorithmus

ulong

Der zweite Algorithmus stützt sich auf die Berechnung der Zahlen:

Aufgrund des Problems der Absicherung kann dieser Algorithmus jedoch nicht ordnungsgemäß behandelt werden 9223372036854775809.

Der verbesserte Algorithmus IsPowerOfTwo_2

<code class="language-c#">private bool IsPowerOfTwo_2(ulong number)
{
    double log = Math.Log(number, 2);
    double pow = Math.Pow(2, Math.Round(log));
    return pow == number;
}</code>

Algorithmus Erklärung

Dieser verbesserte Algorithmus verwendet geschickt die Bitoperation:

<code class="language-c#">bool IsPowerOfTwo(ulong x)
{
    return (x & (x - 1)) == 0;
}</code>
Bitoperator Überprüfen Sie, ob die beiden Bits der entsprechenden Position 1 sind.

1 von der Nummer subtrahieren, um alle 1 bis 0 zu drehen und alle 0 bis 1 zu drehen.

Wenn die Zahl die Leistung von 2 ist, gibt die Binärdatei an, dass es nur eine Ziffer geben wird.

Wenn die Zahl und (x -1) ausgeführt werden und der Betrieb, ist alles außer 1 recht rechts 0.
  • Wenn das Ergebnis 0 ist, ist die Zahl der Leistung von 2. &
  • Null
  • entfernen
  • Um Null zu beseitigen (Null -NOT -kontrollierter Strom ist 2), ist zusätzliche Bedingungen
  • .

Das obige ist der detaillierte Inhalt vonWie können wir effizient feststellen, ob eine Zahl eine Leistung von 2 ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn