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:
NICHTx | ~ 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 = 1
vom Typ Unsigned int mit einer Größe von 8 Bit. 1 in Dezimalzahl kann also wie 00000001
in 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 0b
als Präfix im Literal. Ohne 0b
Prä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 00000000
also 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 00000001
in 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 = 1
ist 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 :
- Schreiben Sie 2 in binärer Form:
00000010
- Invertieren Sie die Ziffern. 0 wird 1 und 1 wird 0:
11111101
- 1 hinzufügen:
11111110
So interpretiert der Compiler die Binärzahl 1111110
als -2
Dezimalzahl. 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 Int8
Typ 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:
UNDx | 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 & yBits
kombiniert 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. 10000011
entspricht 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:
ODERx | 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 | yBits
kombiniert 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 255
in 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:
XORx | 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 yBits
kombiniert 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 124
in 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 10001000
die äquivalent ist 136
in 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 00000100
binär dargestellt wird. Wenn Sie es ein Bit nach rechts verschieben, 00000010
wird zurückgegeben, was 2
in 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 -4
wird wie 11111100
in binär dargestellt. Shifting es um ein Bit nach rechts und 1 in vakanter Position gebracht wird , kehrt 11111110
die äquivalent ist -2
für Int8
Typen. Daher gibt die print(someBits>> 1)
Anweisung -2 auf dem Bildschirm aus.