Schnelle bitweise und Bitverschiebungsoperatoren (mit Beispielen)

In diesem Tutorial lernen Sie verschiedene bitweise Operationen in Swift kennen. Diese werden für die Berechnung der Bitebene in einem Ausdruck verwendet.

Ein Bit wird verwendet, um eine Binärziffer zu bezeichnen. Eine Binärziffer kann zwei mögliche Werte haben, entweder 0 oder 1. Als Programmierer für Anfänger müssen Sie nicht mit Operationen auf Bitebene arbeiten.

Es reicht aus, mit primitiven Datentypen wie Integer, Float, Boolean, String usw. zu arbeiten. Möglicherweise müssen Sie auf Bitebene arbeiten, wenn Sie mit Low-Level-Programmierung arbeiten.

Swift bietet neben den Basisoperatoren eine Vielzahl von Operatoren zum Bearbeiten von Bits. Diese Operatoren ähneln den logischen Operatoren, außer dass sie mit binären Darstellungen von Daten (Bits) arbeiten.

Bitweise Operatoren sind Operatoren, mit denen einzelne Bits eines Operanden geändert werden. Der Operand ist eine Variable oder Konstante, in der die Operation ausgeführt wird.

Alle in Swift verfügbaren bitweisen Operatoren sind unten aufgeführt:

1. Bitweiser NICHT-Operator

Es wird durch ein Tilde- ~Zeichen dargestellt und kann auf einen einzelnen Operanden angewendet werden. Dies invertiert alle Bits. dh ändert 1 zu 0 und 0 zu 1.

Wenn x eine Variable / Konstante ist, die einen Binärwert enthält, dh 0 oder 1. Die bitweise Nichtoperation der x-Variablen kann in der folgenden Tabelle dargestellt werden:

NICHT
x ~ x
0 1
1 0

Beispiel 1: Bitweiser NOT-Operator für vorzeichenlose Ganzzahl

 let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber) 

Wenn Sie das obige Programm ausführen, lautet die Ausgabe wie folgt:

 254

Im obigen Programm ist die Anweisung let initalNumber:UInt8 = 1vom Typ Unsigned int mit einer Größe von 8 Bit. 1 in Dezimalzahl kann also wie 00000001in Binär dargestellt werden.

Der bitweise Nicht-Operator ändert das gesamte Bit einer Variablen oder Konstante, das Bit 0 wird in 1 und 1 in 0 geändert. InvertedNumber enthält also Bits 11111110. Nach der Konvertierung in eine Dezimalzahl wird sie als 254 dargestellt. Die Anweisung print(invertedNumber)gibt also 254 auf dem Bildschirm aus.

Sie können den bitweisen Operator auch direkt in den Bits ausführen als:

Beispiel 2: Bitweiser NICHT-Operator in Bits

 let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits) 

Wenn Sie das obige Programm ausführen, lautet die Ausgabe wie folgt:

 0

initialBits enthält einen Binärwert 11111111, der 255 in Dezimalzahl entspricht. Um die Zahl in Binärform darzustellen, haben wir 0bals Präfix im Literal. Ohne 0bPräfix wird es als normale Ganzzahl behandelt und es wird ein Überlauffehler angezeigt (UInt8 kann nur Zahlen von 0 bis 255 speichern).

Da wir den bitweisen Nicht-Operator verwendet haben, ändert er alle 1 in 0. Die Konstante invertedBits enthält 00000000also 0 in UInt8.

Beispiel 3: Bitweiser NOT-Operator für vorzeichenbehaftete Ganzzahl

 let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber) 

Wenn Sie das obige Programm ausführen, lautet die Ausgabe wie folgt:

 -2

Im obigen Programm kann 1 in Dezimalzahl wie 00000001in Binär dargestellt werden. Der bitweise Nicht-Operator ändert das gesamte Bit einer Variablen oder Konstante, das Bit 0 wird in 1 und 1 in 0 geändert. InvertedNumber enthält also Bits 11111110. Dies sollte 254 auf dem Bildschirm ausgeben. Gibt aber stattdessen -2 zurück. Seltsam, richtig? Lassen Sie uns unten untersuchen, wie dies geschehen ist.

let initalNumber:Int = 1ist ein vorzeichenbehaftetes int, das sowohl positive als auch negative Ganzzahlen enthalten kann. Wenn wir für eine vorzeichenbehaftete Ganzzahl keinen Operator anwenden, kann die zurückgegebene Binärdatei daher auch eine negative Zahl darstellen.

Wie hat der Compiler -2 als 11111110 binär interpretiert ?

Der Compiler verwendete das Zweierkomplement, um ganze Zahlen darzustellen. Um die negative Notation einer Ganzzahl zu erhalten, sollten Sie zuerst die Zahl in Binärform schreiben, dann die Ziffern invertieren und dem Ergebnis eine hinzufügen.

Schritte, um das Zweierkomplement von -2 herauszufinden :

  1. Schreiben Sie 2 in binärer Form: 00000010
  2. Invertieren Sie die Ziffern. 0 wird 1 und 1 wird 0:11111101
  3. 1 hinzufügen: 11111110

So interpretiert der Compiler die Binärzahl 1111110als -2Dezimalzahl. Aber es gibt eine kleine Wendung, die der Compiler gemacht hat und die wir nicht bemerkt haben. Es wurde auch auf den Typ von invertedNumber als Int8Typ geschlossen.

Um dies zu verstehen, sehen wir uns ein Beispiel an:

 print(Int8(bitPattern: 0b11111110)) print(0b11111110)

Wenn Sie das obige Programm ausführen, lautet die Ausgabe wie folgt:

 -2 254

Im obigen Beispiel hat der Compiler die Binärzahl nur für die vorzeichenbehaftete 8-Bit-Ganzzahl mit -2 dezimal behandelt. Daher print(Int8(bitPattern: 0b11111110))gibt die Anweisung -2 auf dem Bildschirm aus.

Für den normalen Integer-Typ, dessen Größe 32/64 Bit beträgt und der große Werte enthalten kann, wird der Wert als interpretiert 254. Daher Anweisung print(0b11111110)ausgibt , 254 in dem Bildschirm.

2. Bitweiser UND-Operator

Es wird durch &zwei Operanden dargestellt und kann auf diese angewendet werden. Der AND-Operator vergleicht zwei Bits und gibt 1 zurück, wenn beide Bits 1 sind, andernfalls gibt er 0 zurück.

Wenn x und y variabel / konstant sind und den Binärwert 0 oder 1 enthalten, kann die bitweise UND-Verknüpfung für x und y in der folgenden Tabelle dargestellt werden:

UND
x y x & y
0 0 0
0 1 0
1 1 1
1 0 0

Beispiel 5: Bitweise UND-Verknüpfung

 let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:",String(result, radix: 2)) print(result)

Wenn Sie das obige Programm ausführen, lautet die Ausgabe wie folgt:

 Binär: 10000011 131 

Im obigen Programm let result = xBits & yBitskombiniert die Anweisung die Bits zweier Operanden xBits und yBits. Es gibt 1 zurück, wenn beide Bits 1 sind, andernfalls gibt es 0 zurück.

String(value , radix: )Der Initialisierer wird verwendet, um Zahlen in verschiedenen Zahlensystemen darzustellen. Wenn wir den Radixwert 2 angeben, wird die Zahl in ein Binärzahlensystem konvertiert. In ähnlicher Weise können wir 16 für hexadezimal und 10 für dezimal verwenden.

Die Anweisung print("Binary:",String(result, radix: 2))gibt Binary: 10000011 auf dem Bildschirm aus. 10000011entspricht 131 in Dezimalzahl, die Anweisung print(result)gibt 131 in der Konsole aus.

3. Bitweiser ODER-Operator

Es wird als dargestellt |und kann auf zwei Operanden angewendet werden. Der bitweise ODER-Operator vergleicht zwei Bits und erzeugt ein Ergebnis von 1, wenn einer oder mehrere seiner Eingänge 1 sind, andernfalls 0.

Wenn x und y variabel / konstant sind und den Binärwert 0 oder 1 enthalten. Die bitweise ODER-Verknüpfung für x und y kann in der folgenden Tabelle dargestellt werden:

ODER
x y x | y
0 0 0
0 1 1
1 1 1
1 0 1

Beispiel 6: Bitweise ODER-Verknüpfung

 let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result) 

Wenn Sie das obige Programm ausführen, lautet die Ausgabe wie folgt:

 Binär: 11111111 255 

Im obigen Programm let result = xBits | yBitskombiniert die Anweisung die Bits zweier Konstanten xBits und yBits. Es gibt 1 zurück, wenn eines der Bits 1 ist, andernfalls gibt es 0 zurück.

Die Anweisung print("Binary:",String(result, radix: 2))gibt Binary: 11111111 auf dem Bildschirm aus. Da 11111111äquivalent ist 255in dezimalen, die Anweisung print(result)ausgibt , 255 in dem Bildschirm.

4. Bitweiser XOR-Operator

Es wird als dargestellt ^und kann auf zwei Operanden angewendet werden. Der XOR-Operator vergleicht zwei Bits und generiert ein Ergebnis von 1, wenn genau einer seiner Eingänge 1 ist, andernfalls gibt er 0 zurück.

Wenn x und y variabel / konstant sind und den Binärwert 0 oder 1 enthalten, kann die bitweise XOR-Operation für x und y in der folgenden Tabelle dargestellt werden:

XOR
x y x y
0 0 0
0 1 1
1 1 0
1 0 1

Beispiel 7: Bitweise XOR-Operation

 let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits yBits print("Binary:", String(result, radix: 2)) print(result) 

Wenn Sie das obige Programm ausführen, lautet die Ausgabe wie folgt:

 Binär: 1111100 124 

Im obigen Programm let result = xBits yBitskombiniert die Anweisung die Bits zweier Konstanten xBits und yBits. Es gibt 1 zurück, wenn genau eines der Bits 1 ist, andernfalls gibt es 0 zurück.

Die Anweisung print("Binary:",String(result, radix: 2))gibt Binary: 1111100 (entspricht 01111100) auf dem Bildschirm aus. Da 1111100äquivalent ist 124in dezimalen, die Anweisung print(result)ausgibt , 124 in dem Bildschirm.

5. Bitweiser Schaltoperator

Diese Operatoren werden verwendet, um alle Bits in einer Zahl um eine bestimmte Anzahl von Stellen nach links oder rechts zu verschieben, und können auf einen einzelnen Operanden angewendet werden. Es wird als <<oder dargestellt >>.

Es gibt zwei Arten von Schichtarbeitern:

Bitweiser Linksschieber

  • Bezeichnet als <<
  • Dadurch werden die Bits nach links verschoben, angegeben durch die Zahl gefolgt von <<.
  • Die Bitpositionen, die durch die Verschiebungsoperation geräumt wurden, sind mit Nullen gefüllt.
  • Wenn Sie die Bits einer Ganzzahl um eine Position nach links verschieben, verdoppelt sich ihr Wert

Beispiel 8: Bitweiser Linksschieber

 let someBits:UInt8 = 0b11000100 print(someBits << 1) 

Wenn Sie das obige Programm ausführen, lautet die Ausgabe wie folgt:

 136

Im obigen Programm haben wir den Linksschaltoperator verwendet. Mit <<1 können Sie das Bit um 1 nach links verschieben. Die Ziffern werden um eine Position nach links verschoben, und die letzte Ziffer rechts wird mit einer Null gefüllt.

Sie können auch sehen, dass die Ziffer, die von der linken Seite "vom Ende weg" verschoben wird, verloren geht. Es wird nicht wieder von rechts gewickelt. Wenn Sie es um ein Bit nach links verschieben, wird die 1 aus der Binärdatei entfernt und rechts 0 hinzugefügt, um den verschobenen Wert zu füllen. Die restlichen anderen Bits werden um 1 in Richtung der linken Position verschoben.

Dies gibt 10001000die äquivalent ist 136in UInt8. Daher gibt die print(someBits << 1)Anweisung 136 auf dem Bildschirm aus.

Bitweiser Rechtsschieber

  • Bezeichnet als >>
  • Dadurch werden die Bits um die folgende Zahl nach rechts verschoben >>
  • Bei vorzeichenlosen Nummern werden die durch die Verschiebungsoperation frei gewordenen Bitpositionen mit Null gefüllt.
  • Bei vorzeichenbehafteten Zahlen (Zahlen, die auch negativ sein können) wird das Vorzeichenbit verwendet, um die frei gewordenen Bitpositionen zu füllen. Mit anderen Worten, wenn die Zahl positiv ist, wird 0 verwendet, und wenn die Zahl negativ ist, wird 1 verwendet.
  • Wenn Sie es um eine Position nach rechts verschieben, halbiert sich sein Wert.

Beispiel 9: Bitweiser Rechtsverschiebungsoperator für vorzeichenlose Ganzzahlen

 let someBits: UInt8 = 4 print(someBits>> 1) 

Wenn Sie das obige Programm ausführen, lautet die Ausgabe wie folgt:

 2

Im obigen Programm haben wir den Rechtsverschiebungsoperator für eine vorzeichenlose Ganzzahl verwendet. Mit >>1 können Sie das Bit um 1 nach rechts verschieben. Die durch die Verschiebungsoperation frei gewordenen Bitpositionen werden bei einer vorzeichenlosen Ganzzahl immer mit Null gefüllt.

Da 4 wie 00000100binär dargestellt wird. Wenn Sie es ein Bit nach rechts verschieben, 00000010wird zurückgegeben, was 2in entspricht UInt8. Daher gibt die print(someBits>> 1)Anweisung 2 auf dem Bildschirm aus.

Beispiel 10: Bitweiser Rechtsverschiebungsoperator für vorzeichenbehaftete Ganzzahl

 let someBits:Int = -4 print(someBits>> 1) 

Wenn Sie das obige Programm ausführen, lautet die Ausgabe wie folgt:

 -2

Im obigen Programm haben wir den Rechtsverschiebungsoperator für eine vorzeichenlose Ganzzahl verwendet. Im Gegensatz zu positiven Zahlen wird >>bei negativen Zahlen 1 anstelle von 0 verwendet, um die freie Stelle zu füllen.

Da -4wird wie 11111100in binär dargestellt. Shifting es um ein Bit nach rechts und 1 in vakanter Position gebracht wird , kehrt 11111110die äquivalent ist -2für Int8Typen. Daher gibt die print(someBits>> 1)Anweisung -2 auf dem Bildschirm aus.

Interessante Beiträge...