Alte macht 2
Gibt es eine Menge Informationen, wie man die nächste Potenz von 2 ist von einem bestimmten Wert (siehe refs) aber ich finde keine, um die bisherige Leistung der beiden.
Nur so, ich finde so weit ist, um einen Tisch mit aller macht von zwei bis zu 2^64, und eine einfache Suche.
- Holen Sie sich die nächste Potenz von 2 ist, und durch 2 dividieren...?
- Binäre Verschiebung? Teilen?
- Die nächste, durch 2 dividieren.
- Dies sollte eine ziemlich einfache Anpassung der bestehenden algorithmen, die Sie miteinander verknüpft. Können Sie veröffentlichen, was Sie haben, und wir können Ihnen helfen, zusammen mit Tipps?
- Er bittet für die Kraft der zwei, die am nächsten an einem vorgegebenen Wert (und weniger als, nicht größer als der angegebene Wert)
- klar, alle, aber die meisten signifikanten bit. es ist ein allgemein gültiges Rezept, können Sie in vielfältiger Weise umgesetzt
- Danke, das macht diese Frage viel mehr Sinn.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom Hacker ' s Delight, einen schönen astfreie Lösung:
Dies dauert in der Regel 12 Anweisungen. Sie können es in weniger, wenn Ihre CPU verfügt über den "count leading zeroes" - Anweisung.
bsr
Lösung für AMD CPUs, 3-4x schneller für eine 32-bit-version und 1,5-2x für 64-bit-version. Ich habe gehört, es ist das Gegenteil für Intel, aber ich haben keinen Zugriff auf Ihre CPUs zu testen.Danke für die Antworten. Ich werde versuchen, zusammenfassen und erklären, ein wenig etwas klarer.
Was dieser Algorithmus tut, verändert sich zu 'lieben' alle bits nach dem ersten " ein " - bit, verursachen diese sind die einzigen bits, die machen können, unser 'x' größer als der vorhergehende Potenz von zwei.
Nachdem Sie sicher, Sie sind 'diejenigen', es entfernt nur Ihnen verlassen die ersten 'ein' bit intakt. Das einzige bisschen an seiner Stelle unserer bisherigen Leistung der beiden.
Wohl die einfachste Methode (für positive zahlen):
Können Sie Variationen in viele Richtungen, wenn Sie wollen zu optimieren.
Ist hier ein Einzeiler für die Nachwelt (ruby):
Wenn man die nächst höhere Potenz von 2, der nächst-niedrigeren Potenz von 2 ist entweder der nächst höhere oder die Hälfte. Es hängt davon ab, was man als die "nächsthöhere" für eine beliebige Potenz von 2 ist (und was Sie betrachten, um die nächst-niedrigeren Potenz von 2).
Was
Ist es nur modifizierte Methode von http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogLookup.
Diese erfordern, wie 7 Operationen und es könnte schneller zum ersetzen von Multiplikationen mit shift.
Wenn Sie die Arbeit in der Basis 2, springen Sie von eine Potenz von zwei, um die nächsten ein, indem Sie einfach hinzufügen oder entfernen einer Ziffer aus der rechten Seite.
Zum Beispiel, die frühere macht der zwei, die Zahl 8 ist die Zahl 4. In Binär:
01000 -> 0100 (wir entnehmen die nachfolgenden null zu bekommen, Nummer 4)
Also den Algorithmus zum lösen der Rechnung von der vorherigen Leistung der beiden ist:
previousPower := Zahl shr 1
previousPower = Zahl >> 1
(oder eine beliebige andere syntax)
number
ist auch eine Potenz von 2 ist. Wennnumber
ist sagen wir 11, dann wird dies nicht funktionieren.Diese kann getan werden, in einer Zeile.
Ergebnis
Hier eine besser lesbare version in c#, mit der <=0 guard-Klausel verteilt, um die utility-Methoden.
Code unten finden Sie die bisherige Leistung von 2:
Dies ist meine aktuelle Lösung zu finden, die nächsten und vorherigen Potenzen von zwei beliebigen positiven Ganzzahl n und auch eine kleine Funktion, um zu bestimmen, ob eine Zahl Potenz von zwei.
Diese Implementierung für Ruby.
Beispiel verwenden:
Für die bisherige Leistung der beiden, der Suche nach dem nächsten und Division durch zwei ist etwas langsamer als die oben genannte Methode.
Ich bin nicht sicher, wie es funktioniert mit Bignums.