Bitgewise Operation
Im Computerprogrammierung, a Bitgewise Operation arbeitet auf a Bit String, a Bit -Array oder ein Binäre Ziffer (als eine Bit -String) auf der Ebene seiner Person angesehen Bits. Es ist eine schnelle und einfache Aktion, grundlegend für die arithmetischen Operationen auf höherer Ebene und direkt von der unterstützt werden Prozessor. Die meisten bitweisen Operationen werden als Anweisungen mit zwei Operands dargestellt, bei denen das Ergebnis einen der Eingangsoperanden ersetzt.
Bei einfachen kostengünstigen Prozessoren sind bitweise Operationen normalerweise wesentlich schneller als die Teilung, mehrmals schneller als die Multiplikation und manchmal erheblich schneller als die Addition. Während moderne Prozessoren normalerweise zusätzliche Ergänzungen und Multiplikation durchführen Unterrichtspipelines und andere Architektur Entwurfsmöglichkeiten, bitgewieller Vorgänge, verbrauchen aufgrund der verringerten Verwendung von Ressourcen üblicherweise weniger Leistung.[1]
Bitgewise -Operatoren
In den folgenden Erklärungen wird jeder Hinweis auf die Position eines Bits von der rechten (am wenigsten signifikanten) Seite gezählt, was nach links voranschreitet. Zum Beispiel hat der binäre Wert 0001 (Dezimal 1) Nullen an jeder Position außer dem ersten (d. H. Das rechts).
NICHT
Das bitweise nicht, oder bitweise Ergänzung, ist ein Unary Operation das läuft Logische Negation auf jedem Bit die Bildung der Einen Ergänzung des gegebenen binären Wertes. Bits, die 0 sind, werden 1 und diejenigen, die 1 sind. Zum Beispiel: zum Beispiel:
NICHT 0111 (Dezimalzahl 7) = 1000 (Dezimalzahl 8)
Nicht 10101011 (Dezimaler 171) = 01010100 (Dezimalzahl 84)
Das Ergebnis entspricht dem Zwei ergänzt des Wertes minus eins. Wenn die Komplementarithmetik von Two verwendet wird, dann Nicht x = -x -1
.
Für nicht signiert GanzzahlenDie bitweise Ergänzung einer Zahl ist die "Spiegelreflexion" der Zahl über den halben Punkt des nicht signierten Ganzzahlbereichs. Zum Beispiel für 8-Bit-nicht signierte Ganzzahlen,, Nicht x = 255 - x
, die in einem Diagramm als Abwärtslinie sichtbar gemacht werden kann, die einen zunehmenden Bereich von 0 bis 255 effektiv "umdrehen", bis zu einem abnehmenden Bereich von 255 bis 0. Ein einfaches, aber veranschaulichendes Beispiel besteht darin als unsignierte Ganzzahl gespeichert.
UND

A bitweise und ist ein Binäroperation Das erfordert zwei gleiche binäre Darstellungen und führt die durch logisch und Betrieb auf jedem Paar der entsprechenden Bits. Wenn also beide Bits in der verglichenen Position 1 sind, beträgt das Bit in der resultierenden binären Darstellung 1 (1 × 1 = 1); Andernfalls beträgt das Ergebnis 0 (1 × 0 = 0 und 0 × 0 = 0). Zum Beispiel:
0101 (Decimal 5) und 0011 (Dezimalzahl 3) = 0001 (Dezimalzahl 1)
Der Vorgang kann verwendet werden, um festzustellen, ob ein bestimmtes Bit ist einstellen (1) oder klar (0). Zum Beispiel bei einem Bitmuster 0011 (Dezimalzahl 3), um festzustellen, ob das zweite Bit eingestellt ist, verwenden wir ein bitgewiehen und mit einem Bitmuster, das nur im zweiten Bit 1 enthält:
0011 (Dezimalzahl 3) und 0010 (Dezimales 2) = 0010 (Dezimalzahl 2)
Da das Ergebnis 0010 ungleich Null ist, wissen wir, dass das zweite Bit im ursprünglichen Muster festgelegt wurde. Dies wird oft genannt Bitmaskierung. (Analogie die Verwendung von Abdeckband Abdeckungen, oder Masken, Teile, die nicht verändert werden sollten oder Teile, die nicht von Interesse sind. In diesem Fall maskieren die 0 -Werte die Bits, die nicht von Interesse sind.)
Das bitweise und kann verwendet werden, um ausgewählte Bits zu löschen (oder Flaggen) eines Registers, in dem jedes Bit eine Person darstellt Boolesche Zustand. Diese Technik ist eine effiziente Möglichkeit, eine Reihe von booleschen Werten mit möglichst wenig Speicher wie möglich zu speichern.
Zum Beispiel kann 0110 (Dezimal 6) als Satz von vier Flags betrachtet werden, wobei die erste und vierte Flaggen klar sind (0) und die zweite und dritte Flags eingestellt sind (1). Die dritte Flagge kann durch Verwendung eines bitweisen und mit dem Muster, das nur im dritten Bit Null hat, gelöscht werden:
0110 (Dezimalzahl 6) und 1011 (Dezimalheit 11) = 0010 (Dezimalzahl 2)
Aufgrund dieser Eigenschaft wird es einfach, das zu überprüfen Parität einer Binärzahl durch Überprüfen des Wertes des niedrigsten Werts. Verwenden des obigen Beispiels:
0110 (Dezimaler 6) und 0001 (Dezimal 1) = 0000 (Dezimaler 0)
Da 6 und 1 Null sind, ist 6 um zwei teilbar und daher gleichmäßig.
ODER

A bitweise oder ist ein Binäroperation Das erfordert zwei Bitmuster gleicher Länge und führt die durch logisch inklusive oder Operation auf jedem Paar entsprechender Bits. Das Ergebnis in jeder Position beträgt 0, wenn beide Bits 0 sind, während das Ergebnis ansonsten 1. ist: Zum Beispiel:
0101 (Decimal 5) oder 0011 (Dezimalzahl 3) = 0111 (Dezimalzahl 7)
Das bitweise oder kann verwendet werden, um auf 1 die ausgewählten Bits des oben beschriebenen Registers einzustellen. Zum Beispiel kann das vierte Bit 0010 (Dezimal 2) durch bitgewiats oder mit dem Muster mit nur dem vierten Bit eingestellt werden:
0010 (dezimal 2) oder 1000 (Dezimalzahl 8) = 1010 (Dezimalzahl 10)
Xor

A bitweise xor ist ein Binäroperation Das erfordert zwei Bitmuster gleicher Länge und führt die durch logisch exklusiv oder Operation auf jedem Paar entsprechender Bits. Das Ergebnis in jeder Position beträgt 1, wenn nur eines der Bits 1 ist, aber 0 ist, wenn beide 0 oder beides 1. In diesem Fall den Vergleich von zwei Bits durchführen, 1, wenn die beiden Bits unterschiedlich sind, und 0 Wenn sie gleich sind. Zum Beispiel:
0101 (Dezimaler 5) xor 0011 (Dezimalzahl 3) = 0110 (Dezimalzahl 6)
Das bitweise XOR kann verwendet werden, um ausgewählte Bits in ein Register (auch Umschalter oder Flip bezeichnet) zu umkehren. Jedes Bit kann durch Xoring mit 1 umgeschaltet werden. Zum Beispiel kann das Bitmuster 0010 (Dezimal 2) der zweiten und vierten Bit von einem bitweisen XOR mit einem Bit -Muster, das 1 in der zweiten und vierten Positionen enthält, umgeschaltet werden:
0010 (Dezimales 2) xor 1010 (Decimal 10) = 1000 (Dezimalzahl 8)
Diese Technik kann verwendet werden, um Bitmuster zu manipulieren, die Sätze von Booleschen Zuständen darstellen.
Montagesprache Programmierer und Optimierung Compiler Verwenden Sie manchmal XOR als Kurzzeit, um den Wert von a zu setzen registrieren bis Null. Das Durchführen von XOR mit einem Wert gegen sich selbst ergibt immer Null, und bei vielen Architekturen erfordert dieser Vorgang weniger Taktzyklen und Speicher, als ein Nullwert zu laden und auf das Register zu speichern.
Wenn der Satz von Bitstringen mit fester Länge n (d.h. Maschinenwörter) wird als als angesehen n-Dimensional Vektorraum über dem aufstellen und dann entspricht die Vektor Addition dem bitweisen XOR.
Mathematische Äquivalente
Assuming Für die nicht negativen Ganzzahlen können die bitweisen Operationen wie folgt geschrieben werden:
Wahrheitstabelle für alle binären logischen Operatoren
Es gibt 16 möglich Wahrheit Funktionen von zwei Binäre Variablen; Dies definiert a Wahrheitstabelle.
Hier ist die bitweise äquivalente Operationen von zwei Bits P und Q:
p | q | F0 | NOCH1 | Xq2 | ¬p3 | ↛4 | ¬q5 | Xor6 | NAND7 | UND8 | Xnor9 | q10 | Wenn, dann11 | p12 | Dann wenn13 | ODER14 | T15 | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||
1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | ||
0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | ||
0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | ||
Bitweise Äquivalente | 0 | NICHT (p oder q) | (Nicht p) Und Q | NICHT p | p und (Nicht q) | NICHT q | p xor q | NICHT (P und Q) | p und q | NICHT (p xor q) | q | (Nicht p) Oder q | p | p oder (Nicht q) | p oder q | 1 |
Bit verschiebt sich
Das Bit verschiebt sich werden manchmal als bitweise Operationen angesehen, da sie einen Wert als eine Reihe von Bits und nicht als numerische Menge behandeln. In diesen Operationen werden die Ziffern bewegt oder verschobenlinks oder rechts. Register In einem Computerprozessor haben eine feste Breite, sodass einige Bits an einem Ende des Registers "verschoben" werden, während die gleiche Anzahl von Bits vom anderen Ende "verschoben" wird. Die Unterschiede zwischen den Bitverschiebungsoperatoren liegen darin, wie sie die Werte der verschobenen Bits bestimmen.
Bit Adressierung
Wenn die Breite des Registers (häufig 32 oder sogar 64) größer ist als die Anzahl der Bits (normalerweise 8) der kleinsten adressierbaren Einheit, häufig als Byte bezeichnet, induzieren die Schaltvorgänge ein Adressierungsschema von den Bytes zu den Bits. Dadurch werden die Orientierungen "links" und "rechts" aus dem Standardschreiben von Zahlen in a entnommen Place-Wert-Notation, so dass eine linke Verschiebung zunimmt und eine rechte Verschiebung den Wert der Zahl verringert - wenn die linken Ziffern zuerst gelesen werden, besteht dies aus a Big-Endian Orientierung. Die Missachtung der Randeffekte an beiden Enden des Registers verhalten sich arithmetische und logische Verschiebungsoperationen gleich, und eine Verschiebung um 8 -Bit -Positionen transportiert das Bitmuster mit 1 Byte -Position auf folgende Weise:
Little-Endian Bestellung: Eine linke Verschiebung um 8 Positionen erhöht die Byteadresse um 1, Eine rechte Verschiebung um 8 Positionen verringert die Byteadresse um 1. Big-Endian Bestellung: Eine linke Verschiebung um 8 Positionen verringert die Byteadresse um 1, Eine rechte Verschiebung um 8 Positionen erhöht die Byteadresse um 1.
Arithmetische Verschiebung


In einem (n arithmetische VerschiebungDie Bits, die aus beiden Enden verschoben werden, werden verworfen. In einer linken arithmetischen Verschiebung werden Nullen nach rechts verschoben; In einer rechten arithmetischen Verschiebung die Zeichenbit (Die MSB in Two's Komplement) wird links verschoben, wodurch das Zeichen des Operanden erhalten bleibt.
In diesem Beispiel wird ein 8-Bit-Register verwendet, das als Komplement von Two interpretiert wird:
00010111 (Decimal +23) Linkshift = 00101110 (Decimal +46)
10010111 (Dezimales –105) Rechtsverschiebung = 11001011 (Dezimaler –53)
Im ersten Fall wurde die Ziffer links am Ende des Registers überschritten, und eine neue 0 wurde in die Position des Rechts in die Position gebracht. Im zweiten Fall wurde die bis rechtliche 1 ausgeschoben (vielleicht in die Fahne tragen), und ein neuer 1 wurde in die links in die Position kopiert, wodurch das Zeichen der Anzahl erhalten wurde. Mehrere Schichten werden manchmal um eine Reihe von Ziffern auf eine einzige Verschiebung verkürzt. Zum Beispiel:
00010111 (Decimal +23) Linksverschiebung für zwei = 01011100 (Decimal +92)
Eine linke arithmetische Verschiebung von n entspricht dem Multiplizieren mit 2n (vorausgesetzt, der Wert nicht Überlauf), während eine rechte arithmetische Verschiebung zu n von a Zwei ergänzt Wert entspricht der Einnahme der Boden von Division durch 2n. Wenn die Binärzahl als behandelt wird Einen Ergänzung, dann führt der gleiche Rechtsverschiebungsbetrieb in der Division um 2n und Rundung in Richtung Null.
Logische Verschiebung
![]() Linke logische Verschiebung | ![]() Rechte logische Verschiebung |
In einem logische Verschiebung, Nullen werden eingeschoben, um die weggeworfenen Bits zu ersetzen. Daher sind die logischen und arithmetischen Linksverschiebungen genau gleich.
Da der logische Rechtsverschiebungen Wert von 0 Bit in das bedeutendste Bit einfügt, ist es ideal für nicht signierte Binärzahlen ideal, während der arithmetische Rechtsverschiebung ideal für die Signiert ist Zwei ergänzt Binärzahlen.
Rundschicht
Eine andere Form der Verschiebung ist die Rundschicht, Bitweise Rotation oder Bitrotation.
Drehen
![]() Linke kreisförmige Verschiebung oder drehen | ![]() Rechte kreisförmige Verschiebung oder Drehung |
In dieser Operation, manchmal genannt Kein Tragen drehenDie Bits werden so "gedreht", als wären die linken und rechten Ende des Registers verbunden. Der Wert, der während eines linken Verschiebung in die rechts verschoben wird, ist der Wert, den Wert links herausgezogen hat, und umgekehrt für einen Rechtsverschiebungsvorgang. Dies ist nützlich, wenn es notwendig ist, alle vorhandenen Bits beizubehalten, und wird häufig in Digital verwendet Kryptographie.[Klarstellung erforderlich]
Durch das Tragen drehen
![]() Links drehen durch das Tragen | ![]() Rechte drehen Sie sich durch das Tragen |
Durch das Tragen drehen ist eine Variante des Drehvorgangs, bei dem das Bit, das in (an beiden Enden) verschoben wird .
Ein einzelnes durch das Tragen drehen Kann eine logische oder arithmetische Verschiebung einer Position simulieren, indem das Tragflag vorher eingerichtet wird. Zum Beispiel, wenn die Tragflagge 0 enthält, dann X rechtsdurchdringliches Durchgang
ist eine logische Rechtsverschiebung, und wenn das Tragflag eine Kopie des Zeichenbits enthält, dann ist dann X rechtsdurchdringliches Durchgang
ist ein arithmetischer Rechtsverschiebung. Aus diesem Grund einige Mikrocontroller wie Low End Bilder nur haben drehen und durch das Tragen drehenund kämpfen Sie sich nicht um arithmetische oder logische Verschiebungsanweisungen.
Durch das Tragen drehen ist besonders nützlich, wenn Verschiebungen auf Zahlen, die größer sind als der native Prozessor, durchführen WortgrößeDenn wenn eine große Zahl in zwei Registern gespeichert wird, muss das Bit, das von einem Ende des ersten Registers verschoben wird, am anderen Ende des zweiten einsteigen. Mit einem Drehzutrich wird dieses Bit während der ersten Schicht in der Tragflagge "gespeichert", und bereit, während der zweiten Schicht ohne zusätzliche Vorbereitung einzuschieben.
In hochrangigen Sprachen
C-Familie und Python
Im C-Familie Sprachen, die logischen Verschiebungsoperatoren sind "<<
"Für die linke Verschiebung und">>
"Für die rechte Verschiebung. Die Anzahl der Plätze, die sich zu verschieben, wird dem Operator als zweites Argument angegeben. Zum Beispiel,
x = y << 2;
zuweist x
Das Ergebnis des Verschiebens y
Links von zwei Bits, was einer Multiplikation von vier entspricht.
Verschiebungen können zu implementierungsdefiniertem Verhalten führen oder undefiniertes VerhaltenEs muss also darauf geachtet werden, sie zu verwenden. Das Ergebnis der Verschiebung durch ein bisschen Anzahl größer oder gleich der Größe des Wortes ist ein undefiniertes Verhalten in C und C ++.[2][3] Ein negativer Wert rechtsverschiebend ist implementierungsdefiniert und nicht durch gute Codierungspraxis empfohlen.[4] Das Ergebnis der linksverschiebenden Wertstätigkeit ist undefiniert, wenn das Ergebnis im Ergebnistyp nicht dargestellt werden kann.[2]
In C#ist der Rechten eine arithmetische Verschiebung, wenn der erste Operand ein INT oder lang ist. Wenn der erste Operand vom Typ Uint oder Ulong ist, ist die rechte Verschiebung eine logische Verschiebung.[5]
Kreisschichtverschiebungen
In der C-Familie der Sprachen fehlt ein Drehbetreiber (obwohl C ++ 20 liefert std :: Rotl
und std :: rotr
), aber man kann von den Schaltoperatoren synthetisiert werden. Es muss darauf geachtet werden, dass die Aussage gut gebildet ist, um sie zu vermeiden undefiniertes Verhalten und Timing -Angriffe in Software mit Sicherheitsanforderungen.[6] Zum Beispiel eine naive Implementierung, die einen 32-Bit x
durch n
Positionen sind einfach
uint32_t x = ..., n = ...; uint32_t y = (x << n) | (x >> (32 - n));
Eine Verschiebung von jedoch 0
Bits führt zu undefiniertem Verhalten im rechten Ausdruck (x >> (32 - n))
Weil 32 - 0
ist 32
, und 32
ist außerhalb des Bereichs 0–31 inklusive. Ein zweiter Versuch könnte dazu führen
uint32_t x = ..., n = ...; uint32_t y = n ? (x << n) | (x >> (32 - n)) : x;
wo die Schichtmenge getestet wird, um sicherzustellen, dass sie nicht definiertes Verhalten einführt. Der Zweig fügt jedoch einen zusätzlichen Codepfad hinzu und bietet die Möglichkeit für die Zeitanalyse und einen Angriff, der in der Hochintegritätssoftware häufig nicht akzeptabel ist.[6] Darüber hinaus kompiliert der Code mehrere Maschinenanweisungen, die häufig weniger effizient sind als der native Befehl des Prozessors.
Um das undefinierte Verhalten und Zweige darunter zu vermeiden GCC und KlangDas Folgende wird empfohlen. Das Muster wird von vielen Compilern erkannt, und der Compiler wird eine einzelne Drehanweisung ausgeben:[7][8][9]
uint32_t x = ..., n = ...; uint32_t y = (x << n) | (x >> (-n & 31));
Es gibt auch Compiler-spezifisch Intrinsik Implementierung Kreisschichtverschiebungen, wie _ROTL8, _ROTL16, _ROTR8, _ROTR16 in Microsoft Visuell c ++. Clang bietet einige drehende Intrinsik für Microsoft -Kompatibilität, die unter den oben genannten Problemen leidet.[9] GCC bietet keine Drehtrinker. Intel liefert auch x86 Intrinsik.
Java
Im JavaAlle ganzzahligen Typen sind signiert, also das "<<
" und ">>
"Die Bediener führen arithmetische Verschiebungen durch. Java fügt den Bediener hinzu">>>
"Um logische rechte Verschiebungen durchzuführen, aber da die logischen und arithmetischen Linksverschiebungsoperationen für die signierte Ganzzahl identisch sind, gibt es keine"<<<
"Betreiber in Java.
Weitere Details der Java Shift -Operatoren:[10]
- Die Betreiber
<<
(Linksverschiebung),>>
(signierte rechte Verschiebung) und>>>
(unsignierte rechte Verschiebung) werden als die genannt Schichtbetreiber. - Der Typ des Verschiebungsausdrucks ist der geförderte Typ des linken Operanden. Zum Beispiel,
Abyte >>> 2
ist äquivalent zu((int) aByte) >>> 2
. - Wenn der beförderte Typ des linken Operanden int ist, werden nur die fünf Bits der rechten Hand unter der Schaltentfernung verwendet. Es ist, als ob der rechte Operand einem bitweisen logischen und operativen und mit dem Maskenwert 0x1f (0B11111) ausgesetzt wäre.[11] Der tatsächlich verwendete Schichtabstand liegt daher immer im Bereich von 0 bis 31, einschließlich.
- Wenn der beförderte Typ des linken Operanden lang ist, werden nur die sechs Bits der rechten Hand unter den ordnungsgemäßen Operanden als Verschiebungsabstand verwendet. Es ist, als ob der rechte Operand einem bitweisen logischen und operativen und mit dem Maskenwert 0x3f (0B111111) ausgesetzt wäre.[11] Der tatsächlich verwendete Schichtabstand liegt daher immer im Bereich von 0 bis 63, einschließlich.
- Der Wert von
n >>> s
ist n rechts verändert s Bitpositionen mit Null-Erweiterung. - In Bit- und Schaltvorgängen der Typ
Byte
wird implizit konvertiert zuint
. Wenn der Byte -Wert negativ ist, ist das höchste Bit eins, dann werden diejenigen verwendet, um die zusätzlichen Bytes im int zu füllen. Sobyte b1 = -5; int i = b1 | 0x0200;
wird darin enden, dassi == -5
.
JavaScript
JavaScript Verwendet bitweise Operationen, um jeweils zwei oder mehr zu bewerten Einheiten Platz bis 1 oder 0.[12]
Pascal
In Pascal sowie in all seinen Dialekten (wie z. Objekt Pascal und Standard Pascal), Die logischen linken und rechten Schaltoperatoren sind "Shl
" und "Shr
", jeweils sogar für signierte ganze Zahlen, Shr
verhält sich wie eine logische Verschiebung und kopiert das Zeichenbit nicht. Die Anzahl der Orte, an denen sich die Verschiebung zu verschieben, wird als zweites Argument angegeben. Zum Beispiel zugewiesen die folgenden x Das Ergebnis des Verschiebens y Links von zwei Bits:
x : = y Shl 2;
Sonstiges
- Popcount, verwendet in der Kryptographie
- Zählen Sie führende Nullen
Anwendungen
Bitgewise Operations sind insbesondere bei Programmierungen unter niedrigerer Ebene wie Gerätetreiber, Grafik mit niedriger Ebene, Kommunikationsprotokollpaketpaket und Decodierung erforderlich.
Obwohl Maschinen häufig effiziente integrierte Anweisungen zur Durchführung arithmetischer und logischer Operationen haben, können alle diese Operationen durchgeführt werden, indem die bitweisen Operatoren und Null-Tests auf verschiedene Weise kombiniert werden.[13] Zum Beispiel hier ist a Pseudocode Implementierung von Alte ägyptische Multiplikation zeigen, wie man zwei willkürliche Ganzzahlen multipliziert a
und b
(a
größer als b
) Verwenden Sie nur Bitverschiebungen und Addition:
c ← 0 während b ≠ 0 wenn (b und 1) ≠ 0 c ← c + a links Wechsel a durch 1 Rechts Wechsel b durch 1 Rückkehr c
Ein weiteres Beispiel ist eine Pseudocode -Implementierung von Addition, die zeigt, wie eine Summe von zwei Ganzzahlen berechnet wird a
und b
Verwenden von Bitwise-Operatoren und Null-Testing:
während a ≠ 0 c ← b und a b ← b xor a links Wechsel c durch 1 a ← c Rückkehr b
boolsche Algebra
Manchmal ist es nützlich, komplexe Ausdrücke zu vereinfachen, die aus bitiden Operationen bestehen, beispielsweise beim Schreiben von Compilern. Das Ziel eines Compilers ist es, a zu übersetzen Programmiersprache auf hoher Ebene in die effizienteste Maschinensprache möglich. Boolesche Algebra wird verwendet, um komplexe Bitgewise -Ausdrücke zu vereinfachen.
UND
x & y = y & x
x & (y & z) = (x & y) & z
-
x & 0xffff = x
[14] x & 0 = 0
x & x = x
ODER
x | y = y | x
x | (y | z) = (x | y) | z
x | 0 = x
x | 0xffff = 0xffff
x | x = x
NICHT
~ (~ x) = x
Xor
x ^ y = y ^ x
x ^ (y ^ z) = (x ^ y) ^ z
x ^ 0 = x
x ^ y ^ y = x
x ^ x = 0
x ^ 0xffff = ~ x
Zusätzlich kann XOR mit den 3 grundlegenden Operationen (und nicht) komponiert werden (und nicht)
a ^ b = (a | b) & (~ a | ~ b)
a ^ b = (a & ~ b) | (~ a & b)
Andere
x | (x & y) = x
x & (x | y) = x
~ (x | y) = ~ x & ~ y
~ (x & y) = ~ x | ~ y
x | (y & z) = (x | y) & (x | z)
x & (y | z) = (x & y) | (x & z)
x & (y ^ z) = (x & y) ^ (x & z)
x + y = (x ^ y) + ((x & y) << 1)
x - y = ~ (~ x + y)
Inversen und Lösen von Gleichungen
Es kann schwierig sein, für Variablen in Booleschen Algebra zu lösen, da im Gegensatz zu regulären Algebra mehrere Operationen keine Inversen haben. Operationen ohne Umkehrungen verlieren einige der ursprünglichen Datenbits, wenn sie durchgeführt werden, und es ist nicht möglich, diese fehlenden Informationen wiederherzustellen.
- Hat umgekehrt
- NICHT
- Xor
- Nach links drehen
- Drehe nach rechts
- Keine inverse
- UND
- ODER
- Nach links verschieben
- Nach rechts verschieben
Operationsreihenfolge
Operationen ganz oben in dieser Liste werden zuerst ausgeführt. Eine vollständigere Liste finden Sie im Hauptartikel.
Siehe auch
Verweise
- ^ "Cmicrotek Low-Power Design Blog". Cmicrotek. Abgerufen 2015-08-12.
- ^ a b JTC1/SC22/WG14 N843 "C -Programmiersprache", Abschnitt 6.5.7
- ^ "Arithmetische Operatoren - cppreference.com". en.cppreference.com. Abgerufen 2016-07-06.
- ^ "INT13-C. Verwenden Sie bitweise Operatoren nur bei nicht signierten Operanden". Cert: sichere Codierungsstandards. Software Engineering Institute, Carnegie Mellon University. Abgerufen 2015-09-07.
- ^ "Operator (C# Referenz)". Microsoft. Abgerufen 2013-07-14.
- ^ a b "Nahe ständige Zeit dreht sich, die die Standards nicht verletzt?". Stack Exchange -Netzwerk. Abgerufen 2015-08-12.
- ^ "Schlechte Optimierung der tragbaren drehenden Idiom". GNU GCC -Projekt. Abgerufen 2015-08-11.
- ^ "Kreisförmige Drehung, die nicht gegen den C/C ++ - Standard verstößt?". Intel Developer -Foren. Abgerufen 2015-08-12.
- ^ a b "Konstant, die nicht in die Inline -Assemblierung ausbreitet, führt zu" Einschränkungen "Ich erwartet einen ganzzahligen konstanten Ausdruck" "". LLVM -Projekt. Abgerufen 2015-08-11.
- ^ Die Java -Sprachspezifikation, Abschnitt 15.19. Schichtbetreiber
- ^ a b "Kapitel 15. Ausdrücke". Oracle.com.
- ^ "JavaScript bitweise". W3schools.com.
- ^ "Synthetisierende arithmetische Operationen mithilfe von Bit-Verschiebungs-Tricks". Bisqwit.iki.fi. 2014-02-15. Abgerufen 2014-03-08.
- ^ In diesem Artikel bedeutet 0xffff, dass alle Bits in Ihrem Datentyp auf 1 gesetzt werden müssen. Die genaue Anzahl der Bits hängt von der Breite des Datentyps ab.
- ^ - Ist Negation hier, nicht die Subtraktion
- ^ - Ist die Subtraktion hier, nicht die Negation
Externe Links
- Online -Bitwise Calculator Unterstützt bitweise und, oder und xor
- Xorcat, ein Tool für Bitwise-Xor-Dateien/Streams
- Division mit Bitshifts
- "Bitgewise Operations mod n"Von Enrique Zeleny, Wolfram Demonstrationsprojekt.
- "Diagramme von Zusammensetzungen bitgewiärer Operationen"Von Enrique Zeleny, das Wolfram Demonstrations -Projekt.