Kotlin nodrošina vairākas funkcijas (infix formā), lai veiktu operāciju bitu un bitu maiņas režīmā. Šajā rakstā jūs uzzināsiet veikt bitu līmeņa darbību Kotlīnā, izmantojot piemērus.
Bitu līmeņa un bitu nobīdes operatori tiek izmantoti tikai diviem neatņemamiem tipiem ( Int
un Long
), lai veiktu bitu līmeņa darbības.
Lai veiktu šīs darbības, Kotlins nodrošina 7 funkcijas, izmantojot infix apzīmējumus.
1. vai
or
Funkcija salīdzina atbilst biti divām vērtībām. Ja kāds no bitiem ir 1, tas dod 1. Ja nē, tas dod 0. Piemēram,
12 = 00001100 (binārā formātā) 25 = 00011001 (binārā formātā) pa bitiem VAI 12 un 25 darbības 00001100 vai 00011001 ________ 00011101 = 29 (aiz komata)
Piemērs: Bitwise vai darbība
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 or number2 // result = number1.or(number2) println(result) )
Palaidot programmu, izeja būs:
29
2. un
and
Funkcija salīdzina atbilst biti divām vērtībām. Ja abi biti ir 1, to novērtē uz 1. Ja kāds no bitiem ir 0, tas tiek vērtēts uz 0. Piemēram,
12 = 00001100 (binārā) 25 = 00011001 (binārā) 12 un 25 bitu darbība 00001100 un 00011001 ________ 00001000 = 8 (decimāldaļās)
Piemērs: Bitwise un darbība
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 and number2 // result = number1.and(number2) println(result) )
Palaidot programmu, izeja būs:
8
3. xor
xor
Funkcija salīdzina atbilst biti divām vērtībām. Ja atbilstošie biti ir atšķirīgi, tas dod 1. Ja atbilstošie biti ir vienādi, tas dod 0. Piemēram,
12 = 00001100 (binārā formātā) 25 = 00011001 (binārā formātā) pa bitiem vai 12 un 25 darbības 00001100 xor 00011001 ________ 00010101 = 21 (decimāldaļās)
Piemērs: Darbība pa bitiem vai xor
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 xor number2 // result = number1.xor(number2) println(result) )
Palaidot programmu, izeja būs:
21
4. inv ()
Funkcija inv () apgriež bitu modeli. Tas veic ik pēc 0 līdz 1 un ik pēc 1 līdz 0.
35 = 00100011 (binārā formātā) Papildinājums ar bitiem pa 35 00100011 ________ 11011100 = 220 (aiz komata)
Piemērs: papildinājums pa bitiem
fun main(args: Array) ( val number = 35 val result: Int result = number.inv() println(result) )
Palaidot programmu, izeja būs:
-36
Kāpēc mēs iegūstam izeju -36, nevis 220?
Tas ir tāpēc, ka kompilators rāda šī skaitļa 2 papildinājumus; binārā skaitļa negatīvs apzīmējums.
Jebkuram veselam skaitlim n būs n papildinājums 2 -(n+1)
.
Decimāls binārā 2 papildinājums --------- --------- ---------------------------- ----------- 0 00000000 - (11111111 + 1) = -00000000 = -0 (decimāldaļa) 1 00000001 - (11111110 + 1) = -11111111 = -256 (decimālskaitlis) 12 00001100 - (11110011 +1) = -11110100 = -244 (decimālskaitlis) 220 11011100 - (00100011 + 1) = -00100100 = -36 (decimāldaļa) Piezīme: Pārplūde tiek ignorēta, aprēķinot 2. papildinājumu.
35 papildinājums bitā ir 220 (aiz komata). 2 papildinājums no 220 ir -36. Tādējādi izeja ir -36, nevis 220.
5. shl
Par shl
funkciju pārmaiņas bit modelis pa kreisi ar noteiktu skaitu noteiktajā bitiem, un nulles biti tiek pārvietoti uz zemu pasūtījuma pozīcijām.
212 (binārā: 11010100) 212 shl 1 novērtē līdz 424 (binārā: 110101000) 212 shl 0 novērtē līdz 212 (binārā: 11010100) 212 shl 4 novērtē līdz 3392 (binārā: 110101000000)
Piemērs: Bitu kustība pa kreisi
fun main(args: Array) ( val number = 212 println(number shl 1) println(number shl 0) println(number shl 4) )
Palaidot programmu, izeja būs:
424 212 3392
6. shr
Par shr
funkciju pārmaiņas mazliet pattery pa labi pa certin skaitu noteiktajā bitiem.
212 (binārā: 11010100) 212 shr 1 novērtē līdz 106 (binārā: 01101010) 212 shr 0 vērtē līdz 212 (binārā: 11010100) 212 shr 8 vērtē līdz 0 (binārā: 00000000)
Ja skaitlis ir 2 papildinājuma parakstīts skaitlis, zīmes bits tiek pārvietots augstākās kārtas pozīcijās.
fun main(args: Array) ( val number = 212 println(number shr 1) println(number shr 0) println(number shr 8) )
Palaidot programmu, grupa būs:
106 212 0
7. ushr
Par ushr
funkciju pārmaiņas nulli uz visvairāk pa kreisi pozīcijā.
Piemērs: parakstīta un neparakstīta labā maiņa
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) )
Palaidot programmu, izeja būs:
2 2 -3 2147483645
Ievērojiet, kā parakstītā un neparakstītā labās nobīdes funkcija darbojas atšķirīgi 2 papildinājumam.
2 papildinājums 2147483645
ir 3
.