Ich verstehe bitweise Operationen und wie sie für verschiedene Zwecke nützlich sein könnten, z. Berechtigungen. Ich verstehe jedoch nicht, was die Bit-Shift-Operatoren sind. Ich verstehe, wie sie funktionieren, aber ich kann mir keine Szenarien vorstellen, in denen ich sie verwenden möchte, wenn ich nicht wirklich schnell Multiplikation oder Division machen möchte. Gibt es noch andere Gründe für Bit-Shifting?
Es gibt viele Gründe, hier sind einige:
Aus diesen und anderen Gründen haben die meisten Prozessoren Bitverschiebungs- und / oder Rotationsbefehle sowie andere Logikbefehle (und / oder / xor / nicht).
In der Vergangenheit waren Multiplikation und Division wesentlich langsamer, da es sich um komplexere Operationen handelt und einige CPUs überhaupt keine.
Siehe auch hier: Hattest du schon mal Bit-Shifting in Real? Projekte?
Wie Sie angeben, ist eine Verschiebung nach links dasselbe wie eine Multiplikation mit zwei. Zumindest wenn es um nicht signierte Mengen geht. Die Bedeutung einer "Linksverschiebung" einer signierten Menge ist ... sprachabhängig.
Mit modernen Compilern gibt es wirklich keinen Unterschied zwischen dem Schreiben von "i = x * 2;" und "i = x & lt; & lt; 1;" Der Compiler erzeugt den effizientesten Code. In diesem Sinne gibt es keinen Grund, die Verschiebung über Multiplizieren vorzuziehen.
Einige Algorithmen arbeiten, indem sie eine um ein Bit zurückbleibende Größe verschieben und dann das niedrige Bit auf entweder 0 oder 1 setzen. Einige einfache Komprimierungsalgorithmen funktionieren auf diese Weise. Wenn sich beispielsweise Ihr akkumulierter Wert in der Variablen x befindet und der aktuelle Wert (0 oder 1) in y ist, dann ist es sinnvoller, statt "x = (x & lt; & lt; 1) | y" zu schreiben "x = (x * 2) + y". Beide machen dasselbe, aber das erste ist mehr notational korrekt. Du musst nicht denken: "Oh, richtig, multiplizieren mit zwei ist das Gleiche wie eine Linksverschiebung."
Auch wenn Sie über Algorithmen sprechen, die Bits verschieben, ist es bequemer, nach links oder rechts um eine bestimmte Anzahl von Bits zu verschieben, als herauszufinden, welches Vielfache von 2 Sie multiplizieren oder dividieren möchten.
Es gibt also normalerweise keinen Leistungsvorteil beim Verschieben statt beim Multiplizieren - zumindest nicht, wenn Sie mit Hochsprachen arbeiten - es gibt Zeiten, in denen die Fähigkeit zu verschieben das, was Sie tun, leichter verständlich macht.
Es gibt viele Orte, wo Bit-Shift-Operationen außerhalb ihrer Verwendung in numerischen Berechnungen regelmäßig verwendet werden. Zum Beispiel ist Bitboard eine Datenstruktur, die üblicherweise in Brettspielen für die Darstellung von Brettern verwendet wird. Einige der stärksten Schach-Engines verwenden diese Datenstruktur hauptsächlich für die Geschwindigkeit und Leichtigkeit der Bewegungserzeugung und -bewertung. Diese Programme verwenden Bit-Operationen stark und Bit-Shift-Operationen werden speziell in vielen Kontexten verwendet - wie das Finden von Bitmasken, das Erzeugen neuer Bewegungen auf der Platine, das sehr schnelle Berechnen von Logarithmen usw. Es gibt sogar sehr fortgeschrittene numerische Berechnungen elegant durch geschickte Verwendung von Bit-Operationen. Schauen Sie sich diese Seite für Bit Twiddling Hacks an - viele dieser Algorithmen verwenden Shift-Operatoren. Bit-Shift-Operationen werden regelmäßig bei der Gerätetreiberprogrammierung, Codec-Entwicklung, Programmierung eingebetteter Systeme usw. verwendet.
Shifting ermöglicht den Zugriff auf bestimmte Bits innerhalb einer Variablen. Der Ausdruck (n >> p) & ((1 << m) - 1)
ruft einen m
-Bit-Teil der Variablen n
mit einem Offset von p
Bits von rechts ab.
Dies ermöglicht Ihrem Programm, Ganzzahlen zu verwenden, die keine Vielfachen von 8 Bits sind, was für die Datenkomprimierung nützlich ist.
Zum Beispiel habe ich es in meinen Netflix Prize Programmen verwendet, um Datensätze zu packen (22-Bit User ID + 15-Bit Film ID + 12-Bit-Datum + 3-Bit-Bewertung) in ein uint64_t
(mit 12 Bits zu ersetzen).
Ein sehr häufiger Sonderfall besteht darin, 8 bool
Variablen in jedes Byte zu packen. (Unix-Dateiberechtigungen, Schwarz-Weiß-Bitmaps, CPU-Flags-Register , usw.)
Auch Bitmanipulation wird in UTF-8 verwendet, was eine sehr beliebte Zeichencodierung ist. Unicode-Zeichen werden dargestellt, indem ihre Bits über 1, 2, 3 oder 4 Bytes verteilt werden.
Tags und Links bit-manipulation bit-shift