English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Kotlin fornisce diverse funzioni (in forma infix) per eseguire operazioni a bit e di shift. In questo articolo, imparerai a eseguire operazioni a livello di bit in Kotlin con esempi.
I operatori di operazione a bit e gli operatori di shift sono utilizzati solo su due tipi di interi (Int e Long) per eseguire operazioni a livello di bit.
Per eseguire queste operazioni, Kotlin fornisce 7 funzioni con simbolo infix.
La funzione OR confronta i bit corrispondenti di due valori. Se almeno uno dei bit è 1, il risultato è 1. Altrimenti è 0. Ad esempio:
12 = 00001100 (Binary) 25 = 00011001 (Binary) Operazione OR bit a bit tra 12 e 25 00001100 or 00011001 ________ 00011101 = 29 (decimale)
fun main(args: Array<String>) { val number1 = 12 val number2 = 25 val result: Int result = number1 or number2 // result = number1.or(number2) println(result) }
Quando si esegue questo programma, l'output è:
29
The AND function compares the corresponding bits of two values. If both bits are 1, the result is 1. If either bit is 0, the result is 0. For example,
12 = 00001100 (Binary) 25 = 00011001 (Binary) Bitwise AND operation between 12 and 25 00001100 and 00011001 ________ 00001000 = 8 (Decimal)
fun main(args: Array<String>) { val number1 = 12 val number2 = 25 val result: Int result = number1 and number2 // result = number1.and(number2) println(result) }
Quando si esegue questo programma, l'output è:
8
The XOR function compares the corresponding bits of two values. If the corresponding bits are different, the result is 1. If the corresponding bits are the same, the result is 0. For example,
12 = 00001100 (Binary) 25 = 00011001 (Binary) Bitwise XOR operation between 12 and 25 00001100 xor 00011001 ________ 00010101 = 21 (Decimal)
fun main(args: Array<String>) { val number1 = 12 val number2 = 25 val result: Int result = number1 xor number2 // result = number1.xor(number2) println(result) }
Quando si esegue questo programma, l'output è:
21
The inv() function performs a bitwise NOT. It changes each 0 to 1, and each 1 to 0.
35 = 00100011 (Binary) Bit complement operation for 35 00100011 ________ 11011100 = 220 (Decimal)
fun main(args: Array<String>) { val number = 35 val result: Int result = number.inv() println(result) }
Quando si esegue questo programma, l'output è:
-36
Why do we output -36 instead of 220?
This is because the compiler displays the 2's complement of the number. The negative sign of the binary number.
For any integer n, the 2's complement of n will be -(n + 1).
Decimal Binary 2's complement --------- --------- --------------------------------------- 0 00000000 -(11111111+1) = -00000000 = -0(decimal) 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 due.
Il complemento a due di 35 è 220 (decimale). Il complemento a due di 220 è -36. Pertanto, l'output è -36 invece di 220.
La funzione shl sposta il modello di bit di un numero di posizioni specificate a sinistra, e i bit zero vengono spostati alla posizione più bassa.
212 (binario: 11010100) 212 shl 1 valuta a 424 (binario: 110101000) 212 shl 0 valuta a 212 (binario: 11010100) 212 shl 4 valuta a 3392 (binario: 110101000000)
fun main(args: Array<String>) { val number = 212 println(number shl 1) println(number shl 0) println(number shl 4) }
Quando si esegue questo programma, l'output è:
424 212 3392
La funzione shr sposta il modello di bit di un numero di posizioni specificate a destra.
212 (binario: 11010100) 212 shr 1 calcola 106 (binario: 01101010) 212 shr 0 calcola 212 (binario: 11010100) 212 shr 8 calcola 0 (binario: 00000000)
Se il numero è il complemento a due, sposta il bit di segno alla posizione più alta.
fun main(args: Array<String>) { val number = 212 println(number shr 1) println(number shr 0) println(number shr 8) }
Quando esegui il programma, l'output sarà:
106 212 0
La funzione ushr sposta lo zero alla posizione più a sinistra.
fun main(args: Array<String>) { val number1 = 5 val number2 = -5 // Shift a destra con segno println(number1 shr 1) // Shift a destra senza segno println(number1 ushr 1) // Shift a destra con segno println(number2 shr 1) // Shift a destra senza segno println(number2 ushr 1) }
Quando si esegue questo programma, l'output è:
2 2 -3 2147483645
Attenzione, per il complemento a due, il funzionamento delle funzioni di shift a destra con segno e senza segno è diverso.
Il complemento a due di 2147483645 è 3.