Programmiersprachen werden oft mit verschiedenen Bitoperatoren geliefert (z. B. bitweise Links- und Rechtsverschiebung, bitweises UND, ODER, XOR ...). Diese werden jedoch nicht sehr gewöhnt, oder zumindest war dies meine Erfahrung. Sie werden manchmal bei Programmierherausforderungen oder Interviewfragen verwendet, oder die Lösung kann sie erfordern, z.
- Erstellen Sie ohne Verwendung eines Gleichheitsoperators eine Funktion, die zurückgibt,
true
wenn zwei Werte gleich sind - Tauschen Sie den Wert von zwei Variablen aus, ohne eine dritte Variable zu verwenden
Diese wiederum haben wahrscheinlich nur wenige reale Verwendungszwecke. Ich denke, dass sie schneller sein sollten, weil sie den Speicher auf einer niedrigen Ebene direkt manipulieren.
Warum gibt es solche in den meisten Programmiersprachen? Gibt es Anwendungsfälle aus der realen Welt?
return !(x-y);
:? Ich weiß nichtAntworten:
Nein, sie haben viele reale Anwendungen und sind grundlegende Operationen auf Computern.
Sie werden verwendet für
Logischerweise laufen alle Operationen auf einem Computer letztendlich auf Kombinationen dieser bitweisen Operationen auf niedriger Ebene hinaus, die innerhalb der elektrischen Tore des Prozessors stattfinden.
quelle
Weil sie grundlegende Operationen sind.
Mit der gleichen Überlegung könnte man argumentieren, dass Addition nur wenige reale Verwendungen hat, da sie vollständig durch Subtraktion (und Negation) und Multiplikation ersetzt werden kann. Aber wir behalten die Ergänzung bei, weil es eine grundlegende Operation ist.
Und denken Sie nicht einen Moment, dass nur, weil Sie nicht viel Bedarf an bitweisen Operationen gesehen haben, dies nicht bedeutet, dass sie nicht sehr oft verwendet werden. In der Tat habe ich bitweise Operationen in fast jeder Sprache verwendet, die ich für Dinge wie Bitmaskierung verwendet habe.
Ich verwende bitweise Operationen für die Bildverarbeitung, für Bitfelder und Flags, für die Textverarbeitung (z. B. alle Zeichen einer bestimmten Klasse haben häufig ein gemeinsames Bitmuster), für die Codierung und Decodierung serialisierter Daten, für die Decodierung von VMs oder CPUs Opcodes und so weiter. Ohne bitweise Operationen würden die meisten dieser Aufgaben viel komplexere Operationen erfordern, um die Aufgabe weniger zuverlässig oder mit schlechterer Lesbarkeit auszuführen.
Beispielsweise:
Das Dekodieren von CPU-Anweisungen für RISC-CPUs (z. B. beim Emulieren einer anderen Plattform) erfordert das Extrahieren von Teilen mit einem großen Wert wie oben. Manchmal kann die Ausführung dieser Operationen mit Multiplikation und Division und Modulo usw. bis zu zehnmal langsamer sein als die entsprechenden bitweisen Operationen.
quelle
Ein typisches Beispiel ist das Extrahieren der einzelnen Farben aus einem 24-Bit-RGB-Wert und zurück.
BEARBEITEN: Von http://www.docjar.com/html/api/java/awt/Color.java.html
quelle
Hier ist ein Beispiel aus der Praxis, das Sie in Quake 3, Quake 4 finden. Doom III. All diese Spiele, die die Q3-Engine verwendeten .
(Um diesen Code zu verstehen, muss man verstehen, wie Gleitkommazahlen gespeichert sind, darauf kann ich definitiv nicht näher eingehen.)
In Bezug auf die Verwendung, es sei denn, Sie sind in Bereichen, die Bit-Verschiebung erfordern, wie z. B. Netzwerke oder Grafiken, finden Sie ihren Zweck möglicherweise etwas akademisch. Aber immer noch interessant (für mich zumindest).
quelle
Das Schalten ist schneller als das Multiplizieren oder Dividieren durch eine Zweierpotenz. Zum Beispiel multipliziert a << = 2 a mit 4. Umgekehrt dividiert a >> = 2 a durch vier. Mit den bitweisen Operatoren können Daten auch bitweise an ein Gerät ausgegeben werden. Zum Beispiel können wir N serielle Datenströme aus einem N-Pin-Port senden, indem wir Shift-, Xor- und "and" -Operationen innerhalb von N-Schleifen verwenden. Alles, was mit digitaler Logik erreicht werden kann, kann auch mit Software erreicht werden und umgekehrt.
quelle
Vor langer Zeit waren Bitoperatoren nützlich. Heute sind sie es weniger. Oh, sie sind nicht völlig nutzlos, aber es ist lange her, dass ich gesehen habe, dass eine verwendet wurde, die hätte verwendet werden sollen.
1977 war ich Assembler-Programmierer. Ich war überzeugt, dass Assembler die einzig wahre Sprache war. Ich war mir sicher, dass eine Sprache wie Pascal für akademische Neulinge gedacht war, die nie wirklich etwas erledigen mussten.
Dann las ich "The C Programming Language" von Kernighan und Ritchie. Es hat meine Meinung völlig geändert. Der Grund? Es hatte Bitoperatoren! Es war eine Assemblersprache! Es hatte nur eine andere Syntax.
Damals konnte ich mir nicht vorstellen, Code ohne Ands, Ors, Shifts und Rotates zu schreiben. Heutzutage benutze ich sie fast nie.
Die kurze Antwort auf Ihre Frage lautet also: "Nichts." Das ist aber nicht ganz fair. Die längere Antwort lautet also: "Meistens nichts."
quelle
Verschlüsselung
Ich schlage vor, einen sehr kleinen Ausschnitt aus dem DES-Verschlüsselungsalgorithmus zu betrachten :
quelle
Viele gute Antworten, daher werde ich diese Verwendungen nicht wiederholen.
Ich benutze sie ziemlich oft in verwaltetem Code (C # / .Net) und es hat nichts mit platzsparenden, leistungsstarken oder cleveren Bitverschiebungsalgorithmen zu tun. Manchmal ist eine Logik einfach gut geeignet, um Daten auf diese Weise zu speichern. Ich benutze sie oft, wenn ich eine Aufzählung habe, aber die Instanzen können gleichzeitig mehrere Werte aus dieser Aufzählung nehmen. Ich kann kein Beispiel für Code aus der Arbeit posten, aber eine schnelle Google-Suche nach "Flags enum" ("Flags" ist die C # -Methode zum Definieren einer bitweisen Enumeration) liefert dieses schöne Beispiel: http: // www.dotnetperls.com/enum-flags .
quelle
Es gibt auch bitparalleles Rechnen. Wenn Ihre Daten nur aus Einsen und Nullen bestehen, können Sie 64 davon in ein vorzeichenloses langes langes Wort packen und 64-Wege-Paralleloperationen durchführen. Genetische Informationen bestehen aus zwei Bits (die die AGCT-Codierung der DNA darstellen), und wenn Sie die verschiedenen Berechnungen bitparallel durchführen können, können Sie viel mehr tun, als wenn Sie dies nicht tun. Ganz zu schweigen von der Datendichte im Speicher - wenn der Speicher oder die Plattenkapazität oder die Kommunikationsbandbreite begrenzt sind, sollte eine Komprimierung / Dekomprimierung in Betracht gezogen werden. Selbst Ganzzahlen mit niedriger Genauigkeit, die in Bereichen wie der Bildverarbeitung auftreten, können die Vorteile der kniffligen bitparallelen Verarbeitung nutzen. Es ist eine ganze Kunst für sich.
quelle
Warum werden sie gefunden?
Nun, das liegt wahrscheinlich daran, dass sie Montageanleitungen entsprechen und manchmal nur für Dinge in höheren Sprachen nützlich sind. Gleiches gilt für die gefürchteten,
GOTO
die derJMP
Montageanleitung entsprechen .Was sind ihre Verwendungen?
Wirklich, es gibt nur zu viele Verwendungszwecke, um sie zu benennen, also werde ich nur eine kürzliche, wenn auch stark lokalisierte, Verwendung geben. Ich arbeite viel mit 6502 Assembly und habe an einer kleinen Anwendung gearbeitet, die Speicheradressen, Werte, Vergleichswerte usw. in Codes konvertiert, die für das GameGenie-Gerät verwendet werden können (im Grunde genommen eine Cheat-Anwendung für das NES). Die Codes werden durch eine Bitmanipulation erzeugt.
quelle
Viele Programmierer sind heutzutage an Computer mit nahezu unbegrenztem Speicher gewöhnt.
Bei einigen Anwendungen werden jedoch immer noch winzige Mikrocontroller programmiert, bei denen jedes Bit zählt (wenn Sie beispielsweise nur über 1 KB RAM oder weniger verfügen), und die bitweisen Operatoren ermöglichen es einem Programmierer, diese Bits einzeln zu verwenden, anstatt viel größere Programme zu verschwenden Abstraktionsentität, die möglicherweise benötigt wird, um einen vom Algorithmus geforderten Zustand zu halten. Die E / A auf diesen Geräten müssen möglicherweise auch bitweise gelesen oder gesteuert werden.
Die "reale Welt" hat weitaus mehr dieser winzigen Mikrocontroller als Server oder PCs.
Bei reinen theoretischen CS-Typen dreht sich bei Turing-Maschinen alles um Zustandsbits.
quelle
Nur eine von vielen Verwendungsmöglichkeiten der bitweisen Operatoren ...
Die bitweisen Operatoren können auch dazu beitragen, den Code besser lesbar zu machen. Beachten Sie die folgende Funktionsdeklaration ....
Es ist sehr leicht zu vergessen, welcher boolesche Parameter was bedeutet, wenn der Code geschrieben oder sogar gelesen wird. Es ist auch leicht, den Überblick über Ihre Zählung zu verlieren. Eine solche Routine kann aufgeräumt werden.
Mit aussagekräftigeren Flaggennamen wird es viel lesbarer.
quelle
Wenn Sie etwas über Unicode wissen , sind Sie wahrscheinlich mit UTF-8 vertraut. Es verwendet eine Reihe von Bittests, Verschiebungen und Masken, um den 20-Bit-Codepunkt in 1 bis 4 Bytes zu packen.
quelle
Ich benutze sie nicht oft, aber manchmal sind sie nützlich. Enum Handling mir ein.
Beispiel:
quelle
Ich bin mir nicht sicher, ob diese Verwendung noch vermerkt wurde:
Ich sehe OR ziemlich oft, wenn ich mit dem illumos-Quellcode (openSolaris) arbeite, um mehrere Rückgabewerte auf 0 oder 1 zu reduzieren, z
quelle