Ich bin jemand, der Code nur zum Spaß schreibt und sich weder in einer akademischen noch in einer professionellen Umgebung wirklich damit beschäftigt hat. Dinge wie diese bitweisen Operatoren entgehen mir also wirklich.
Ich habe einen Artikel über JavaScript gelesen, der anscheinend bitweise Operationen unterstützt. Ich sehe diese Operation immer wieder an einigen Stellen erwähnt, und ich habe versucht zu lesen, um herauszufinden, was genau es ist, aber ich scheine es überhaupt nicht zu verstehen. Also was sind sie? Klare Beispiele wären toll! : D.
Nur noch ein paar Fragen - was sind einige praktische Anwendungen von bitweisen Operationen? Wann könnten Sie sie verwenden?
Antworten:
Da niemand das Thema angesprochen hat, warum diese nützlich sind:
Ich benutze oft bitweise Operationen, wenn ich mit Flags arbeite. Wenn Sie beispielsweise eine Reihe von Flags an eine Operation übergeben möchten (z. B. wenn
File.Open()
sowohl der Lesemodus als auch der Schreibmodus aktiviert sind), können Sie sie als einzelnen Wert übergeben. Dies wird erreicht, indem jedem möglichen Flag ein eigenes Bit in einem Bitset zugewiesen wird (Byte, Short, Int oder Long). Beispielsweise:Wenn Sie also Lesen UND Schreiben übergeben möchten, übergeben Sie (READ | WRITE), in dem die beiden kombiniert werden
Was dann am anderen Ende entschlüsselt werden kann wie:
welche prüft
was zurückkehrt
Dies ist nicht 0, daher gibt das Flag READ an.
Sie können XOR verwenden, um verschiedene Bits umzuschalten. Ich habe dies verwendet, wenn ich ein Flag zum Festlegen von Richtungseingaben (Auf, Ab, Links, Rechts) verwendet habe. Zum Beispiel, wenn sich ein Sprite horizontal bewegt und ich möchte, dass es sich umdreht:
Ich XOR einfach den aktuellen Wert mit (LINKS | RECHTS), wodurch in diesem Fall LINKS aus und RECHTS eingeschaltet wird.
Bitverschiebung ist in mehreren Fällen nützlich.
ist das gleiche wie
Wenn Sie schnell mit einer Zweierpotenz multiplizieren müssen, aber darauf achten müssen, dass ein 1-Bit in das obere Bit verschoben wird, wird die Zahl negativ, es sei denn, sie ist ohne Vorzeichen. Dies ist auch nützlich, wenn Sie mit unterschiedlichen Datengrößen arbeiten. Beispiel: Lesen einer Ganzzahl aus vier Bytes:
Angenommen, A ist das höchstwertige Byte und D das niedrigste. Es würde enden als:
Farben werden häufig auf diese Weise gespeichert (wobei das höchstwertige Byte entweder ignoriert oder als Alpha verwendet wird):
Um die Werte wieder zu finden, verschieben Sie einfach die Bits nach rechts, bis sie unten sind, und maskieren Sie dann die verbleibenden Bits höherer Ordnung:
0xFF
ist das gleiche wie11111111
. Für Red würden Sie also im Wesentlichen Folgendes tun:quelle
Es ist anzumerken, dass die als andere Antworten aufgelisteten Einzelbit-Wahrheitstabellen jeweils nur mit einem oder zwei Eingabebits funktionieren. Was passiert, wenn Sie Ganzzahlen verwenden, z.
Die Antwort liegt in der binären Erweiterung jedes Eingangs:
Jedes Bitpaar in jeder Spalte wird durch die "UND" -Funktion geführt, um das entsprechende Ausgangsbit in der unteren Zeile zu erhalten. Die Antwort auf den obigen Ausdruck lautet also 4. Die CPU hat (in diesem Beispiel) 8 separate "UND" -Operationen parallel ausgeführt, eine für jede Spalte.
Ich erwähne das, weil ich mich noch daran erinnere, dieses "AHA!" Moment, als ich vor vielen Jahren davon erfuhr.
quelle
Bitweise Operatoren sind Operatoren, die jeweils ein Bit bearbeiten.
UND ist nur dann 1, wenn beide Eingänge 1 sind.
ODER ist 1, wenn einer oder mehrere seiner Eingänge 1 sind.
XOR ist nur dann 1, wenn genau einer seiner Eingänge 1 ist.
NOT ist nur dann 1, wenn seine Eingabe 0 ist.
Diese können am besten als Wahrheitstabellen beschrieben werden. Die Eingabemöglichkeiten befinden sich oben und links. Das resultierende Bit ist einer der vier Werte (zwei im Fall von NOT, da es nur einen Eingang hat), die am Schnittpunkt der beiden Eingänge angezeigt werden.
Ein Beispiel ist, wenn Sie nur die unteren 4 Bits einer ganzen Zahl wollen, Sie UND es mit 15 (binär 1111) also:
quelle
Dies sind die bitweisen Operatoren, die alle in JavaScript unterstützt werden:
op1 & op2
- DerAND
Operator vergleicht zwei Bits und generiert ein Ergebnis von 1, wenn beide Bits 1 sind. Andernfalls wird 0 zurückgegeben.op1 | op2
- DerOR
Operator vergleicht zwei Bits und generiert ein Ergebnis von 1, wenn die Bits komplementär sind. Andernfalls wird 0 zurückgegeben.op1 ^ op2
- DerEXCLUSIVE-OR
Operator vergleicht zwei Bits und gibt 1 zurück, wenn eines der Bits 1 ist, und gibt 0, wenn beide Bits 0 oder 1 sind.~op1
- Mit demCOMPLEMENT
Operator werden alle Bits des Operanden invertiert.op1 << op2
- DerSHIFT LEFT
Operator verschiebt die Bits nach links, verwirft das Bit ganz links und weist dem Bit ganz rechts den Wert 0 zu. Bei jeder Bewegung nach links wird op1 effektiv mit 2 multipliziert.op1 >> op2
- DerSHIFT RIGHT
Operator verschiebt die Bits nach rechts, verwirft das Bit ganz rechts und weist dem Bit ganz links den Wert 0 zu. Jede Bewegung nach rechts teilt op1 effektiv in zwei Hälften. Das am weitesten links stehende Vorzeichenbit bleibt erhalten.op1 >>> op2
- Der OperatorSHIFT RIGHT
-ZERO FILL
verschiebt die Bits nach rechts, verwirft das Bit ganz rechts und weist dem Bit ganz links den Wert 0 zu. Jede Bewegung nach rechts teilt op1 effektiv in zwei Hälften. Das am weitesten links stehende Vorzeichenbit wird verworfen.quelle
1 | 1
gibt1
und nicht0
, und wie|
soll sich dann unterscheiden von^
. Ich musste dieses Q / A vor einigen Tagen als doppeltes Ziel verwenden und wünschte mir, dass man nach 10 Jahren ein klareres kanonisches Duplikat für diese Art von Fragen haben würde.Um es ein bisschen mehr aufzuschlüsseln, hat es viel mit der binären Darstellung des fraglichen Wertes zu tun.
Hoffe das hilft.
quelle
|
ist eine OP-Operation?x | y = 1000 0001 |
TeilWenn der Begriff "bitweise" erwähnt wird, wird manchmal klargestellt, dass es sich nicht um einen "logischen" Operator handelt.
In JavaScript behandeln bitweise Operatoren ihre Operanden beispielsweise als eine Folge von 32 Bits (Nullen und Einsen) . In der Zwischenzeit werden logische Operatoren normalerweise mit booleschen (logischen) Werten verwendet , können jedoch mit nicht-booleschen Typen arbeiten.
Nehmen Sie zum Beispiel expr1 && expr2.
Wie andere angemerkt haben, ist 2 & 4 ein bitweises UND, daher wird 0 zurückgegeben.
Sie können Folgendes in test.html oder etwas anderes kopieren und testen:
quelle
Operationen :
bitweise UND
bitweise ODER
bitweise NICHT
bitweises XOR
etc
Listenpunkt
Z.B.
Verwendung des bitweisen Operators
Z.B.
Z.B.
if else
AnweisungZ.B.
Z.B.
Das bitweise Verschieben funktioniert nur mit + ve Nummer
Es gibt auch einen weiten Anwendungsbereich der bitweisen Logik
quelle
The left-shift and right-shift operators are equivalent to multiplication and division by x * 2y respectively.
Das stimmt! muyiy.cn/question/program/102.htmlEs könnte hilfreich sein, so darüber nachzudenken. So funktioniert AND (&):
Grundsätzlich heißt es, dass beide Zahlen eins sind. Wenn Sie also zwei Zahlen 5 und 3 haben, werden sie in Binärzahlen umgewandelt und der Computer denkt nach
sind beide eins: 00000001 0 ist falsch, 1 ist wahr
Das UND von 5 und 3 ist also eins. Der Operator OR (|) macht dasselbe, außer dass nur eine der Zahlen eins sein muss, um 1 auszugeben, nicht beide.
quelle
Ich hörte immer wieder, wie langsam bitweise JavaScript-Operatoren waren. Ich habe einige Tests für meinen neuesten Blog-Beitrag durchgeführt und festgestellt, dass sie in mehreren Tests 40% bis 80% schneller waren als die arithmetische Alternative. Vielleicht waren sie früher langsam. In modernen Browsern liebe ich sie.
Ich habe einen Fall in meinem Code, der dadurch schneller und einfacher zu lesen ist. Ich werde meine Augen offen halten für mehr.
quelle