Kotlin udostępnia kilka funkcji (w postaci wrostków) do wykonywania operacji bitowych i przesunięć bitowych. W tym artykule nauczysz się wykonywać operacje na poziomie bitowym w Kotlinie za pomocą przykładów.
Operatory przesunięcia bitowego i bitowego są używane tylko na dwóch typach całkowitych ( Int
i Long
) do wykonywania operacji na poziomie bitowym.
Aby wykonać te operacje, Kotlin zapewnia 7 funkcji wykorzystujących notację wrostkową.
1. lub
or
Funkcja porównuje odpowiednie bity obu wartości. Jeśli którykolwiek z bitów ma wartość 1, daje 1. Jeśli nie, daje 0. Na przykład
12 = 00001100 (binarnie) 25 = 00011001 (binarnie) Bitowo LUB Operacja 12 i 25 00001100 lub 00011001 ________ 00011101 = 29 (dziesiętnie)
Przykład: Bitwise lub Operation
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 or number2 // result = number1.or(number2) println(result) )
Po uruchomieniu programu wynik będzie następujący:
29
2. i
and
Funkcja porównuje odpowiednie bity obu wartości. Jeśli oba bity mają wartość 1, jest szacowany na 1. Jeśli którykolwiek z bitów ma wartość 0, jest szacowany na 0. Na przykład
12 = 00001100 (binarnie) 25 = 00011001 (binarnie) Operacja bitowa na 12 i 25 00001100 i 00011001 ________ 00001000 = 8 (dziesiętnie)
Przykład: bitowe i operacja
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 and number2 // result = number1.and(number2) println(result) )
Po uruchomieniu programu wynik będzie następujący:
8
3. xor
xor
Funkcja porównuje odpowiednie bity obu wartości. Jeśli odpowiadające sobie bity są różne, daje 1. Jeśli odpowiadające im bity są takie same, daje 0. Na przykład
12 = 00001100 (binarnie) 25 = 00011001 (binarnie) Bitowo LUB Operacja 12 i 25 00001100 xor 00011001 ________ 00010101 = 21 (dziesiętnie)
Przykład: operacja bitowa xor
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 xor number2 // result = number1.xor(number2) println(result) )
Po uruchomieniu programu wynik będzie następujący:
21
4. inv ()
Funkcja inv () odwraca wzór bitowy. Tworzy co 0 do 1 i co 1 do 0.
35 = 00100011 (binarnie) Uzupełnienie bitowe Operacja 35 00100011 ________ 11011100 = 220 (dziesiętnie)
Przykład: dopełnienie bitowe
fun main(args: Array) ( val number = 35 val result: Int result = number.inv() println(result) )
Po uruchomieniu programu wynik będzie następujący:
-36
Dlaczego otrzymujemy -36 zamiast 220?
Dzieje się tak, ponieważ kompilator pokazuje uzupełnienie do 2 tej liczby; ujemny zapis liczby binarnej.
Dla dowolnej liczby całkowitej n, dopełnienie 2 do n będzie -(n+1)
.
Dziesiętne uzupełnienie dwójkowe --------- --------- ---------------------------- ----------- 0 00000000 - (11111111 + 1) = -00000000 = -0 (dziesiętne) 1 00000001 - (11111110 + 1) = -11111111 = -256 (dziesiętne) 12 00001100 - (11110011 +1) = -11110100 = -244 (dziesiętnie) 220 11011100 - (00100011 + 1) = -00100100 = -36 (dziesiętnie) Uwaga: Przepełnienie jest ignorowane podczas obliczania uzupełnienia do 2.
Uzupełnienie bitowe liczby 35 to 220 (dziesiętnie). Uzupełnienie dwójki do 220 to -36. W związku z tym wyjście wynosi -36 zamiast 220.
5. shl
Te shl
zmiany funkcji układu bitów w lewo o pewnej liczby specyficznych bitów, a bity zerowe są przesuwane do pozycji niskim.
212 (binarnie: 11010100) 212 shl 1 daje w wyniku 424 (binarnie: 110101000) 212 shl 0 daje 212 (binarnie: 11010100) 212 shl 4 daje w wyniku 3392 (binarnie: 110101000000)
Przykład: przesunięcie bitowe w lewo
fun main(args: Array) ( val number = 212 println(number shl 1) println(number shl 0) println(number shl 4) )
Po uruchomieniu programu wynik będzie następujący:
424 212 3392
6. shr
Te shr
zmiany Bit Funkcja pattery na prawo od numeru certin określonych bitów.
212 (binarnie: 11010100) 212 shr 1 szacuje na 106 (binarnie: 01101010) 212 shr 0 szacuje na 212 (binarnie: 11010100) 212 shr 8 szacuje na 0 (binarnie: 00000000)
Jeśli liczba jest liczbą uzupełniającą do 2 ze znakiem, bit znaku jest przesuwany na najwyższe pozycje.
fun main(args: Array) ( val number = 212 println(number shr 1) println(number shr 0) println(number shr 8) )
Po uruchomieniu programu wynik będzie następujący:
106 212 0
7. ushr
Te ushr
zmiany zerowania w skrajnym lewym położeniu.
Przykład: prawy Shift ze znakiem i bez znaku
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) )
Po uruchomieniu programu wynik będzie następujący:
2 2 -3 2147483645
Zwróć uwagę, jak funkcja przesunięcia w prawo ze znakiem i bez znaku działa inaczej dla dopełnienia 2.
Uzupełnienie dwójki 2147483645
jest 3
.