Kotlin ponuja več funkcij (v obliki infiksa) za izvajanje bitnih in bitnih premikov. V tem članku se boste s pomočjo primerov naučili izvajati delovanje nivoja bitov v Kotlinu.
Operatorji bitnega in bitnega premika se uporabljajo samo na dveh integralnih vrstah ( Int
in Long
) za izvajanje operacij na bitni ravni.
Za izvedbo teh operacij Kotlin ponuja 7 funkcij z uporabo infiksnega zapisa.
1. oz
or
Funkcija primerja ustrezne bitov dveh vrednosti. Če je kateri koli od bitov 1, daje 1. Če ne, dobi 0. Na primer,
12 = 00001100 (v binarnem) 25 = 00011001 (v binarnem) Bitno ALI Delovanje 12 in 25 00001100 ali 00011001 ________ 00011101 = 29 (v decimalnem)
Primer: Bit-bit ali delovanje
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 or number2 // result = number1.or(number2) println(result) )
Ko zaženete program, bo rezultat:
29.
2. in
and
Funkcija primerja ustrezne bitov dveh vrednosti. Če sta oba bita 1, se izračuna na 1. Če je kateri koli od bitov 0, se izračuna na 0. Na primer,
12 = 00001100 (v binarnem) 25 = 00011001 (v binarnem) Bit delovanje 12 in 25 00001100 in 00011001 ________ 00001000 = 8 (v decimalnem)
Primer: Bit-bit in delovanje
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 and number2 // result = number1.and(number2) println(result) )
Ko zaženete program, bo rezultat:
8.
3. xor
xor
Funkcija primerja ustrezne bitov dveh vrednosti. Če so ustrezni biti različni, dobi 1. Če so ustrezni biti enaki, da 0. Na primer,
12 = 00001100 (v binarnem) 25 = 00011001 (v binarnem) Bitno ALI Delovanje 12 in 25 00001100 xor 00011001 ________ 00010101 = 21 (v decimalnem)
Primer: Delovanje bitov xor
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 xor number2 // result = number1.xor(number2) println(result) )
Ko zaženete program, bo rezultat:
21.
4. inv ()
Funkcija inv () obrne bitni vzorec. Naredi vsakih 0 do 1 in vsakih 1 do 0.
35 = 00100011 (v binarni različici) Bitno dopolnilo Operacija 35 00100011 ________ 11011100 = 220 (v decimalni številki)
Primer: Bitno dopolnilo
fun main(args: Array) ( val number = 35 val result: Int result = number.inv() println(result) )
Ko zaženete program, bo rezultat:
-36
Zakaj dobimo izhod -36 namesto 220?
To je zato, ker prevajalnik prikazuje dopolnilo te številke 2; negativni zapis binarnega števila.
Za katero koli celo število n bo 2 dopolnilo n -(n+1)
.
Dopolnilo decimalnega binarnega 2 --------- --------- ---------------------------- ----------- 0 00000000 - (11111111 + 1) = -00000000 = -0 (decimalno) 1 00000001 - (11111110 + 1) = -11111111 = -256 (decimalno) 12 00001100 - (11110011 +1) = -11110100 = -244 (decimalno) 220 11011100 - (00100011 + 1) = -00100100 = -36 (decimalno) Opomba: Prelivanje se med računanjem komplementa 2 prezre.
Bitno dopolnilo 35 je 220 (v decimalnih številkah). Komplementa 2 z 220 je -36. Izhod je torej -36 namesto 220.
5. shl
Za shl
funkcijo premiki bitni vzorec, na levi strani z določeno število določenih bitov, in nič bitov se premakne v položajih nizkega reda.
212 (v binarnem: 11010100) 212 shl 1 oceni na 424 (v binarnem: 110101000) 212 shl 0 oceni na 212 (v binarnem: 11010100) 212 shl 4 oceni na 3392 (v binarnem: 110101000000)
Primer: Bit-premik levo
fun main(args: Array) ( val number = 212 println(number shl 1) println(number shl 0) println(number shl 4) )
Ko zaženete program, bo rezultat:
424 212 3392
6. skr
V shr
funkcijski premiki bit pattery pravici iz certin število določenih bitov.
212 (v binarnem: 11010100) 212 shr 1 oceni na 106 (v binarnem: 01101010) 212 shr 0 oceni na 212 (v binarnem: 11010100) 212 shr 8 oceni na 0 (v binarnem: 00000000)
Če je številka dopolnjena podpisana številka 2, se znakovni bit premakne v položaje visokega reda.
fun main(args: Array) ( val number = 212 println(number shr 1) println(number shr 0) println(number shr 8) )
Ko zaženete program, bo izhod:
106 212 0
7. ushr
V ushr
funkcijski premiki nič v skrajnem levem položaju.
Primer: podpisani in nepodpisani desni premik
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) )
Ko zaženete program, bo rezultat:
2 2 -3 2147483645
Upoštevajte, kako podpisana in nepodpisana funkcija desnega premika deluje drugače za dopolnilo 2.
Dopolnilo 2 2147483645
je 3
.