Heim >Backend-Entwicklung >C++ >Ist eine Nummer eine Leistung von 2? Wie können wir das effizient bestimmen?

Ist eine Nummer eine Leistung von 2? Wie können wir das effizient bestimmen?

DDD
DDDOriginal
2025-01-29 19:26:12761Durchsuche

Is a Number a Power of 2?  How Can We Efficiently Determine This?

, ob die Anzahl der Ziffern 2 ist, ist die Leistung von 2

Frage Anweisung

In der Informatik besteht ein häufiges Problem darin, festzustellen, ob die angegebene Zahl die Kraft von 2 ist. Dieses Problem liegt insbesondere in der angewandten und Algorithmusanalyse. Dieser Algorithmus sollte die folgenden Eigenschaften haben:

Der Code ist einfach und klar.
  1. kann jeden nicht signierten langen Ganzzahlwert genau verarbeiten.
  2. Methode
Methode 1: Methode der Leistung der Verschiebung

Eine Methode zur Lösung dieses Problems besteht darin, 2 kontinuierliche Leistung zu iterieren und zu prüfen, ob eine Leistung -One mit der Eingangsnummer übereinstimmt. Dies kann wie folgt implementiert werden: Methode 2: Die Anzahl der Berechnungsalgorithmen

Eine andere Methode beinhaltet die Berechnung der Verwendung der Anzahl der Paare. Dies erfordert jedoch Vorsicht, da schwimmende Punktberechnungen eine Genauigkeit verursachen können. Betrachten Sie den folgenden Code:
<code class="language-c#">private bool IsPowerOfTwo(ulong number)
{
    if (number == 0)
        return false;

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

Die optimale Lösung: Bit -Computer -Methode effektivere Lösungen sind die Verwendung von Bitoperationen. Die Kraft von 2 hat ein einzigartiges Merkmal: Wenn die (x -1) durchgeführt wird und die Operation (&) der Ergebniswert immer 0 beträgt. Dieses Attribut kann wie folgt ausgedrückt werden:

Um den Kandidaten der Leistung von Null als 2 zu beseitigen, kann er geringfügig geändert werden:

<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>

Erläuterung

Überprüfen Sie die Position jedes Bits der binären Darstellung von x und (x -1) anhand der Position und der Operation (&). Wenn beide 1 sind, ist das Ergebnis 1; Daher beträgt die Leistung von 2 0 mit der (x -1) Position und das Berechnungsergebnis von 0.

Diese Methode liefert eine effiziente und direkte Lösung, um festzustellen, ob die Zahl 2 ist.
<code class="language-c#">bool IsPowerOfTwo(ulong x)
{
    return (x & (x - 1)) == 0;
}</code>

Das obige ist der detaillierte Inhalt vonIst eine Nummer eine Leistung von 2? Wie können wir das effizient bestimmen?. 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