English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In this tutorial, you will learn about different bit operations in Swift. They are used for bitwise calculations in expressions.
Bits are used to represent binary numbers. A binary number can have two possible values 0 or1.As a beginner programmer, you do not need to use operations at the bit level.
Using primitive data types such as integer, float, boolean, string, etc. is sufficient. When dealing with low-level programming, you may need to work at the bit level.
In addition toBasic operationsIn addition, Swift also provides a set of rich operators to operate on bits. These operators are similar to logical operators, but they handle the binary representation of data (bits).
Bitwise operators are used to change the bits of an operand. An operand is a variable or constant in which the operation is performed.
The following lists all the bitwise operators available in Swift:
It is represented by the tilde ~ and can be applied to a single operand. This will reverse all bits. That is, it will1Change to 0, change 0 to1。
If x is a binary value (i.e., 0 or1)variable/If it is a constant, the bitwise NOT operation of the x variable can be represented in the table below:
x | ~x |
---|---|
0 | 1 |
1 | 0 |
let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber)
当您运行上述程序时,输出将是:
254
Im obigen Programm ist der Ausdruck let initalNumber:UInt8 = 1 Typ ist Unsigned int, die Größe ist8Bits. Daher ist der Dezimalwert1können binär dargestellt werden als 00000001der Bitnegationsoperator ändert alle Bits eines Variablen oder Konstanten, Bit 0 wird
geändert werden. Daher enthält die umgekehrte Zahl Bits1während1wird nach der Umwandlung in Dezimal als11111110。254。 Daher wird der Ausdruck print(invertedNumber) auf dem Bildschirm ausgegeben254。
kann auch direkt im Bit Bitoperationen ausführen, wie folgt:
let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits)
当您运行上述程序时,输出将是:
0
initialBits enthält den binären Wert11111111entspricht dem Dezimalwert255speichern. Um eine Zahl binär darzustellen, verwenden wir im Text 0b als Präfix. Ohne das Präfix 0b wird es es als gewöhnliche Ganzzahl behandeln und es könnte zu einem Überlauffehler kommen (UInt8können nur 0 bis255zwischen den
Da wir den Bitnegationsoperator verwendet haben, werden alle1in die 0 geändert. Daher enthält der Konstanten reverseBits 00000000, was äquivalent ist zu UInt8wurden alle
let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber)
当您运行上述程序时,输出将是:
-2
Im obigen Programm ist der Dezimalwert1und kann binär dargestellt werden als 00000001verändert werden1, die1geändert werden. Daher enthält die umgekehrte Zahl Bits11111110ausgegeben. Dies sollte auf dem Bildschirm angezeigt werden254。 Statt dessen wird-2。 Seltsam, oder? Lassen Sie uns im Folgenden sehen, wie das passiert.
let initalNumber: Int = 1ist ein signiertes Int, das sowohl positive als auch negative Ganzzahlen enthalten kann. Dies ist der Grund, warum das Ergebnis einer ungerichteten Operation an signierten Ganzzahlen auch eine negative Zahl darstellen kann.
wie der Compiler -2 erklärt11111110 binäres Format?
Der Compiler verwendet das binäre Komplement, um Ganzzahlen darzustellen. Um das negative Binärberein der Ganzzahl zu erhalten, sollten Sie zunächst die Zahl im binären Format schreiben und dann die Zahl umkehren, um dann eine 1 hinzuzufügen.
Berechnen-2Schritte zur Berechnung des binären Komplements:
in binärem Format schreibt2: 00000010
umgekehrte Zahl. 0 wird1während1und in 0:11111101
addiert1: 11111110
Dies ist das, was der Compiler mit Binärzahlen macht1111110in Dezimal dar.-2Art. Aber der Compiler hat ein kleines Problem, das wir nicht bemerkt haben. Er schließt auch die Typisierung von invertedNumber als Int ab8Typ.
Um dies zu verstehen, lassen Sie uns den folgenden Beispiel sehen:
print(Int8(bitPattern: 0b11111110)) print(0b11111110)
当您运行上述程序时,输出将是:
-2 254
Im obigen Beispiel interpretiert der Compiler nur die signierte8Bit-Integer behandelt die binäre Zahl als dezimal-2. Daher wird der Befehl print(Int8(bitPattern: 0b11111110))在屏幕上输出-2。
aber für die Größe von32/64Bits und kann größere Werte als gewöhnliche Integer-Typen enthalten, es interpretiert den Wert als254. Daher wird der Befehl print(0b11111110) ausgegeben254。
Es wird durch & dargestellt und kann auf zwei Operanden angewendet werden. Der AND-Betriebston vergleicht die Bits, wenn beide Bits1,则返回1,否则返回0。
如果x和y是变量/常量,保存二进制值,即0或1. Die Bit-und-Betrieb von x und y kann wie folgt dargestellt werden:
x | y | x & y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
1 | 0 | 0 |
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:", String(result, radix: 2)) print(result)
当您运行上述程序时,输出将是:
Binary: 10000011 131
Im obigen Programm verbindet die Anweisung let result = xBits & yBits die Bits der beiden Operanden xBits und yBits. Wenn beide Bits1,则返回1,否则返回0。
String(value, radix: ) Initialisierungseinstellung verwendet werden, um Zahlen in verschiedenen Zahlensystemen darzustellen. Wenn wir den Basiskennwert2。 Es konvertiert die Zahl in das binäre Zahlensystem. Ebenso können wir mit16stellt Hexadezimalwert dar, mit10stellt Dezimalwert dar.
该语句print("Binary:",String(result, radix: 2))在屏幕上输出 Binary:10000011。10000011entspricht dem Dezimalwert131, wird der Befehl print(result) im Kontrollzentrum ausgegeben131。
Es wird durch | dargestellt und kann auf zwei Operanden angewendet werden. Wenn einer oder mehrere Eingaben des Bit-oder-Betriebstons1,dann werden die beiden Bits verglichen und das Ergebnis generiert1,sonst 0.
Wenn x und y den binären Wert beibehalten (d.h. 0 oder1)variable/. Die Bit-oder-Betrieb von Konstanten x und y kann wie folgt dargestellt werden:
x | y | x | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 1 |
1 | 0 | 1 |
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result)
当您运行上述程序时,输出将是:
Binary: 11111111 255
Im obigen Programm verbindet die Anweisung let result = xBits | yBits die Bits der beiden Konstanten xBits und yBits. Wenn irgendein Bit1,则返回1,否则返回0。
Der Befehl print("Binary:", String(result, radix: 2)) wird auf dem Bildschirm ausgegebenBinary:11111111. Da11111111und255dekadisch äquivalent, daher wird die Anweisung print(result) auf dem Bildschirm ausgegeben255。
Es wird durch ^ dargestellt und kann auf zwei Operanden angewendet werden. Der XOR-Betriebston vergleicht die Bits, wenn nur ein Eingabe ist1,则生成结果1,否则返回0。
如果x和y是变量/常量,保存二进制值,即0或1。x和y上的位异或运算可表示为下表:
x | y | x ^ y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 0 |
1 | 0 | 1 |
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits ^ yBits print("Binary:", String(result, radix: 2)) print(result)
当您运行上述程序时,输出将是:
Binary: 1111100 124
在上面的程序中,let result = xBits ^ yBits 语句结合了两个常量 xBits 和 yBits 的位。如果其中一个位正好是1,则返回1,否则返回0。
该语句print("Binary:",String(result, radix: 2))在屏幕上输出Binary:1111100(相当于01111100)。由于1111100等效124于十进制,因此语句print(result)在屏幕上输出124。
该运算符用于将数字中的所有位向左或向右移动一定数量的位置,并且可以应用于单个操作数。它表示为<<或>>。
移位运算符有两种:
表示为 <<
它会导致位向左移位,该移位是由数字后跟 << 指定的。
移位操作空出的位位置用零填充。
将整数的位左移一个位置会使其值加倍
let someBits:UInt8 = 0b11000100 print(someBits << 1)
当您运行上述程序时,输出将是:
136
在上面的程序中,我们使用了左移运算符。使用<<1表示将位向左移动1。这些数字向左移动一个位置,右侧的最后一个数字填充零。
您还可以看到从左侧“末端”移位的数字丢失。 它不会再次从右侧绕回。 将其向左移位一位将从二进制中移除1,并在右侧添加0以填充移位值,而其他位的其余位则向左位置移位1。
返回10001000,相当于UInt8中的136。因此,print(someBits<<1) 语句在屏幕中输出136。
表示为 >>
它会导致位向右移位,移位的数字后跟 >>
对于无符号数字,移位操作腾出的位位置是零填充的。
对于有符号的数字(也可以是负数),符号位用于填充腾出的位位置。换句话说,如果数字为正,则使用0;如果数字为负,则使用1。
向右移动一个位置,其值将减半。
let someBits: UInt8 = 4 print(someBits >> 1)
当您运行上述程序时,输出将是:
2
在上面的程序中,我们对无符号整数使用了右移运算符。使用 >>1意味着将位向右移动1。移位操作腾出的位位置对于无符号整数总是零填充。
因为,4在二进制中表示为00000100。右移一位,返回00000010,相当于UInt8中的2。因此,print(someBits>>1) 语句在屏幕中输出2。
let someBits:Int = -4 print(someBits >> 1)
当您运行上述程序时,输出将是:
-2
在上面的程序中,我们对无符号整数使用了右移运算符。 与正数不同,使用>>表示负数,使用1填充空位,而不是0。
因为,-4在二进制中表示为11111100。右移一位并将1置于空位,返回11111110,这相当于Int8类型的-2。因此,print(someBits>>1)语句在屏幕中输出-2。