Kotlin fornisce diverse funzioni (in formato infisso) per eseguire operazioni bit per bit e bitshift. In questo articolo imparerai a eseguire operazioni a livello di bit in Kotlin con l'aiuto di esempi.
Gli operatori bit per bit e di spostamento bit vengono utilizzati solo su due tipi integrali ( Int
e Long
) per eseguire operazioni a livello di bit.
Per eseguire queste operazioni, Kotlin fornisce 7 funzioni utilizzando la notazione infissa.
1. o
La or
funzione confronta i bit corrispondenti di due valori. Se uno dei bit è 1, restituisce 1. In caso contrario, restituisce 0. Ad esempio,
12 = 00001100 (in binario) 25 = 00011001 (in binario) Operazione OR bit per bit di 12 e 25 00001100 o 00011001 ________ 00011101 = 29 (in decimale)
Esempio: bit per bit o operazione
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 or number2 // result = number1.or(number2) println(result) )
Quando esegui il programma, l'output sarà:
29
2. e
La and
funzione confronta i bit corrispondenti di due valori. Se entrambi i bit sono 1, viene valutato a 1. Se uno dei bit è 0, viene valutato a 0. Ad esempio,
12 = 00001100 (in binario) 25 = 00011001 (in binario) Bit Operazione di 12 e 25 00001100 e 00011001 ________ 00001000 = 8 (in decimale)
Esempio: bit per bit e operazione
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 and number2 // result = number1.and(number2) println(result) )
Quando esegui il programma, l'output sarà:
8
3. xor
La xor
funzione confronta i bit corrispondenti di due valori. Se i bit corrispondenti sono diversi, restituisce 1. Se i bit corrispondenti sono uguali, restituisce 0. Ad esempio,
12 = 00001100 (in binario) 25 = 00011001 (in binario) Operazione OR bit per bit di 12 e 25 00001100 xor 00011001 ________ 00010101 = 21 (in decimale)
Esempio: operazione xor bit per bit
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 xor number2 // result = number1.xor(number2) println(result) )
Quando esegui il programma, l'output sarà:
21
4. inv ()
La funzione inv () inverte la sequenza di bit. Fa ogni 0 a 1 e ogni 1 a 0.
35 = 00100011 (in binario) Operazione a complemento bit per bit 35 00100011 ________ 11011100 = 220 (in decimale)
Esempio: complemento bit per bit
fun main(args: Array) ( val number = 35 val result: Int result = number.inv() println(result) )
Quando esegui il programma, l'output sarà:
-36
Perché stiamo ottenendo un output -36 invece di 220?
È perché il compilatore mostra il complemento a 2 di quel numero; notazione negativa del numero binario.
Per ogni numero intero n, sarà il complemento a 2 di n -(n+1)
.
Decimale Binario 2 complemento --------- --------- ---------------------------- ----------- 0 00000000 - (11111111 + 1) = -00000000 = -0 (decimale) 1 00000001 - (11111110 + 1) = -11111111 = -256 (decimale) 12 00001100 - (11110011 +1) = -11110100 = -244 (decimale) 220 11011100 - (00100011 + 1) = -00100100 = -36 (decimale) Nota: l'overflow viene ignorato durante il calcolo del complemento a 2.
Il complemento bit a bit di 35 è 220 (in decimale). Il complemento di 2 di 220 è -36. Quindi, l'output è -36 invece di 220.
5. shl
La shl
funzione sposta la sequenza di bit a sinistra di un certo numero di bit specificati e i bit zero vengono spostati nelle posizioni di ordine inferiore.
212 (In binario: 11010100) 212 shl 1 restituisce 424 (In binario: 110101000) 212 shl 0 restituisce 212 (In binario: 11010100) 212 shl 4 restituisce 3392 (In binario: 110101000000)
Esempio: spostamento a sinistra bit per bit
fun main(args: Array) ( val number = 212 println(number shl 1) println(number shl 0) println(number shl 4) )
Quando esegui il programma, l'output sarà:
424212 3392
6. shr
La shr
funzione sposta lo schema di bit a destra del numero di bit specificato.
212 (In binario: 11010100) 212 shr 1 restituisce 106 (In binario: 01101010) 212 shr 0 restituisce 212 (In binario: 11010100) 212 shr 8 restituisce 0 (In binario: 00000000)
Se il numero è un numero con segno in complemento a 2, il bit del segno viene spostato nelle posizioni di ordine superiore.
fun main(args: Array) ( val number = 212 println(number shr 1) println(number shr 0) println(number shr 8) )
Quando esegui il programma, l'uscita sarà:
106 212 0
7. ushr
La ushr
funzione sposta lo zero nella posizione più a sinistra.
Esempio: Maiusc destro con segno e senza segno
fun main(args: Array) ( val number1 = 5 val number2 = -5 // Signed right shift println(number1 shr 1) // Unsigned right shift println(number1 ushr 1) // Signed right shift println(number2 shr 1) // Unsigned right shift println(number2 ushr 1) )
Quando esegui il programma, l'output sarà:
2 2-3 2147483645
Si noti come la funzione di spostamento a destra con segno e senza segno funziona in modo diverso per il complemento a 2.
Il complemento a 2 di 2147483645
è 3
.