English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In questo tutorial, imparerai diverse operazioni bitwise in Swift. Queste sono usate per calcoli a livello di bit negli espressioni.
I bit vengono usati per rappresentare numeri binari. Un numero binario può avere due valori possibili: 0 o 1. Come programmatore principiante, non devi utilizzare operazioni a livello di bit.
L'uso di tipi di dati primitivi, come integer, float, booleano, stringa, è sufficiente. Quando si lavora a livello di programmazione low-level, potresti dover lavorare a livello di bit.
Oltre aOperazioni di baseOltre a questi, Swift fornisce anche un set di operatori ricchi per operare sui bit. Questi operatori sono simili agli operatori logici, ma trattano la rappresentazione binaria dei dati.
Gli operatori bitwise sono usati per modificare i singoli bit di un operando. L'operando è la variabile o costante in cui viene eseguita l'operazione.
Di seguito è riportato un elenco di tutti gli operatori bitwise disponibili in Swift:
È rappresentato dal simbolo ~ e può essere applicato a un singolo operando. Questo invertirà tutti i bit. Cioè, 1 diventerà 0 e 0 diventerà 1.
Se x è una variabile o costante che contiene un valore binario (cioè 0 o 1), l'operazione bitwise NOT della variabile x può essere rappresentata nella tabella seguente:
x | ~x |
---|---|
0 | 1 |
1 | 0 |
let initalNumber: UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber)
當您運行上述程序時,輸出將是:
254
Nel programma sopra, la frase let initalNumber:UInt8 = 1 ha il tipo Unsigned int, con una dimensione di 8 bit. Pertanto, il numero decimale 1 può essere rappresentato come 00000001 in binario.
L'operatore bitwise NOT cambia tutti i bit di una variabile o costante, il bit 0 viene cambiato in 1 e il 1 in 0. Pertanto, il numero inverso contiene i bit 11111110. Convertito in decimale, rappresenta 254. Pertanto, la frase print(invertedNumber) visualizza 254 sullo schermo.
È anche possibile eseguire direttamente operazioni bitwise sui bit, come mostrato di seguito:
let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits)
當您運行上述程序時,輸出將是:
0
L'array 'initialBits' contiene il valore binario 11111111, che corrisponde al valore decimale 255. Per rappresentare un numero in binario, usiamo il prefisso 0b nel testo. Senza il prefisso 0b, viene trattato come un numero intero normale e può verificarsi un errore di overflow (UInt8 può memorizzare solo numeri tra 0 e 255).
Poiché abbiamo utilizzato l'operatore di negazione a livello di bit, abbiamo cambiato tutti i 1 in 0. Pertanto, la costante reverseBits contiene 00000000, che è equivalente a 0 in UInt8.
let initalNumber: Int = 1 let invertedNumber = ~initalNumber print(invertedNumber)
當您運行上述程序時,輸出將是:
-2
Nel programma sopra, 1 decimale può essere rappresentato in binario come 00000001. L'operatore di negazione a livello di bit cambia tutti i bit di una variabile o costante, cambiando il bit 0 in 1 e il bit 1 in 0. Pertanto, l'inversione del numero contiene i bit 11111110. Questo dovrebbe essere visualizzato come 254 sullo schermo. Invece, restituisce -2. Strano, vero? Vediamo come avviene in seguito.
let initalNumber: Int = 1 è un Int con segno che può contenere sia numeri interi positivi che negativi. Ecco perché quando applichiamo l'operatore non a un intero a segno, il numero binario restituito può anche rappresentare un numero negativo.
Come il compilatore interpreta -2 come il formato binario 11111110?
Il compilatore utilizza la rappresentazione in complemento a due per gli interi. Per ottenere il segno negativo del complemento a due di un numero, dovresti scrivere il numero in binario, invertirlo e aggiungere uno.
Passaggi per calcolare il complemento a due di -2:
Scrivere 2 in binario: 00000010
Invertire il numero. 0 diventa 1 e 1 diventa 0: 11111101
Aggiungere 1: 11111110
Questo è il modo in cui il compilatore interpreta il numero binario 1111110 come -2 decimale. Tuttavia, il compilatore ha un piccolo problema che non abbiamo notato. Inoltre, suppone che il tipo di invertedNumber sia Int8.
Per comprendere questo, diamo un'occhiata all'esempio seguente:
print(Int8(bitPattern: 0b11111110)) print(0b11111110)
當您運行上述程序時,輸出將是:
-2 254
Nel esempio sopra, il compilatore interpreta il numero binario come -2 decimale solo per gli interi a 8 bit con segno. Pertanto, la frase print(Int8(bitPattern: 0b11111110)) viene visualizzata sullo schermo come -2.
Ma per i tipi di interi comuni che possono accogliere valori più grandi e sono di 32/64 bit, il valore viene interpretato come 254. Pertanto, la frase print(0b11111110) viene visualizzata sullo schermo254
È rappresentata con & e può essere applicata a due operandi. L'operatore AND confronta due bit, se entrambi i bit sono 1, viene restituito 1, altrimenti 0.
Se x e y sono variabili/constanti che salvano valori binari, ossia 0 o 1, l'operazione AND bit su x e y può essere rappresentata nella seguente tabella:
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("Binario:", String(result, radix: 2)) print(result)
當您運行上述程序時,輸出將是:
Binario: 10000011 131
Nella seguente programma, la statement let result = xBits & yBits combina i bit di due operandi xBits e yBits. Se entrambi i bit sono 1, viene restituito 1, altrimenti 0.
L'inizializzatore di valore String(value, radix:) viene utilizzato per rappresentare numeri in diversi sistemi numerici. Se forniamo un valore di base 2, il numero viene convertito in sistema binario. Allo stesso modo, possiamo usare 16 per esadecimale e 10 per decimale.
La dichiarazione print("Binary:", String(result, radix: 2)) viene visualizzata sullo schermo. Binario: 10000011. 10000011 è equivalente a 131 in decimale, la statement print(result) viene visualizzata nel console.
È rappresentata con | e può essere applicata a due operandi. Se uno o più input dell'operatore OR bit sono 1, viene generato un risultato 1 confrontando i due bit, altrimenti 0.
Se x e y sono variabili/constanti che mantengono valori binari (cioè 0 o 1), l'operazione OR bit su x e y può essere rappresentata nella seguente tabella:
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)
當您運行上述程序時,輸出將是:
Binario: 11111111 255
Nella seguente programma, la statement let result = xBits | yBits combina i bit di due costanti xBits e yBits. Se qualsiasi bit è 1, viene restituito 1, altrimenti 0.
La statement print("Binario:", String(result, radix: 2)) viene visualizzata a schermo.Binario: 11111111. Poiché 11111111 è equivalente a 255 in decimale, la statement print(result) viene visualizzata a schermo.255
È rappresentata con ^ e può essere applicata a due operandi. L'operatore XOR confronta due bit, se solo uno degli input è 1, genera un risultato 1, altrimenti restituisce 0.
Se x e y sono variabili/constanti, salvano i valori binari, ossia 0 o 1. L'operazione XOR bit su x e y può essere rappresentata nella seguente tabella:
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)
當您運行上述程序時,輸出將是:
Binario: 1111100 124
Nel programma sopra, la dichiarazione let result = xBits ^ yBits combina i bit di due costanti xBits e yBits. Se uno dei bit è esattamente 1, viene restituito 1, altrimenti 0.
La dichiarazione print("Binary:", String(result, radix: 2)) viene visualizzata sullo schermo.Binario: 1111100(equivalente a 01111100). Poiché 1111100 è equivalente a 124 in decimale, la dichiarazione print(result) viene visualizzata sullo schermo.124
Questo operatore viene utilizzato per spostare tutti i bit di un numero di una certa quantità di posizioni a sinistra o a destra e può essere applicato a un singolo operando. È rappresentato come << o >>.
Gli operatori di spostamento hanno due tipi:
Rappresentato come <<
Questo causerebbe lo spostamento a sinistra dei bit, specificato dal numero dopo <<.
I bit liberati durante l'operazione di spostamento sono riempiti con zero.
Spostare i bit di un numero intero di una posizione a sinistra lo fa raddoppiare.
let someBits:UInt8 = 0b11000100 print(someBits << 1)
當您運行上述程序時,輸出將是:
136
Nel programma sopra, abbiamo utilizzato l'operatore di spostamento a sinistra. <<1 indica che i bit vengono spostati di una posizione a sinistra. Questi numeri si spostano di una posizione a sinistra, e l'ultimo numero di destra viene riempito con zero.
Puoi anche vedere che i numeri spostati da sinistra 'estremo' vengono persi. Non torneranno mai da destra. Spostare di un bit a sinistra rimuoverà 1 dal binario, aggiungendo 0 per riempire il valore di spostamento, mentre gli altri bit rimangono nella loro posizione.
Restituisce 10001000, equivalente a 136 in UInt8. Pertanto, la dichiarazione print(someBits << 1) viene visualizzata come 136 sullo schermo.
Rappresentato come >>
Questo causerebbe lo spostamento a destra dei bit, seguito da >>
Per i numeri senza segno, i bit liberati durante l'operazione di spostamento sono riempiti con zero.
Per i numeri con segno (o numeri negativi), il bit di segno viene utilizzato per riempire i bit liberati. In altre parole, se il numero è positivo, si utilizza 0; se il numero è negativo, si utilizza 1.
Spostare un bit di posizione verso destra riduce il valore a metà.
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。