Kotlin tarjoaa useita toimintoja (infix-muodossa) bitti- ja bittisiirtotoiminnon suorittamiseksi. Tässä artikkelissa opit suorittamaan bittitason operaation Kotlinissa esimerkkien avulla.
Bitti- ja bittisiirto-operaattoreita käytetään vain kahdessa integraalityypissä ( Int
ja Long
) bittitason operaatioiden suorittamiseksi.
Näiden toimintojen suorittamiseksi Kotlin tarjoaa 7 toimintoa infix-merkintöjen avulla.
1. tai
or
Toiminto vertaa vastaavia bittejä kahdesta arvosta. Jos jompikumpi biteistä on 1, se antaa 1. Jos ei, se antaa 0. Esimerkiksi
12 = 00001100 (binäärimuodossa) 25 = 00011001 (binäärimuodossa) bittiä TAI 12: n ja 25: n toiminta 00001100 tai 00011001 ________ 00011101 = 29 (desimaalina)
Esimerkki: Bittisuuntainen tai käyttö
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 or number2 // result = number1.or(number2) println(result) )
Kun suoritat ohjelmaa, tulos on:
29
2. ja
and
Toiminto vertaa vastaavia bittejä kahdesta arvosta. Jos molemmat bitit ovat 1, se arvioidaan arvoksi 1. Jos jompikumpi bittiä on 0, se arvioidaan arvoksi 0. Esimerkiksi
12 = 00001100 (binaarina) 25 = 00011001 (binaarisena) 12- ja 25-bittitoiminto 00001100 ja 00011001 ________ 00001000 = 8 (desimaalina)
Esimerkki: Bittisuuntainen ja käyttö
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 and number2 // result = number1.and(number2) println(result) )
Kun suoritat ohjelmaa, tulos on:
8
3. xor
xor
Toiminto vertaa vastaavia bittejä kahdesta arvosta. Jos vastaavat bitit ovat erilaisia, se antaa 1. Jos vastaavat bitit ovat samat, se antaa 0. Esimerkiksi
12 = 00001100 (binäärimuodossa) 25 = 00011001 (binäärimuodossa) bittiä TAI 12: n ja 25: n toiminta 00001100 xor tai 00011001 ________ 00010101 = 21 (desimaalina)
Esimerkki: Bittikohtainen tai -toiminto
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 xor number2 // result = number1.xor(number2) println(result) )
Kun suoritat ohjelmaa, tulos on:
21
4. inv ()
Inv () -funktio kääntää bittikuvion. Se tekee jokaisen 0: sta 1: een ja 1: stä 0: een.
35 = 00100011 (binäärimuodossa) Täydennys bitin mukaan 35 00100011 ________ 11011100 = 220 (desimaalina)
Esimerkki: Täydellinen bitti
fun main(args: Array) ( val number = 35 val result: Int result = number.inv() println(result) )
Kun suoritat ohjelmaa, tulos on:
-36
Miksi saamme tuotoksen -36 220 sijasta?
Se johtuu siitä, että kääntäjä näyttää 2: n täydennyksen kyseisestä luvusta; binääriluvun negatiivinen merkintä.
Mikä tahansa kokonaisluku n, n: n 2: n komplementti on -(n+1)
.
Desimaalibinaarisen 2 komplementti --------- --------- ---------------------------- ----------- 0 00000000 - (11111111 + 1) = -00000000 = -0 (desimaali) 1 00000001 - (11111110 + 1) = -11111111 = -256 (desimaali) 12 00001100 - (11110011 +1) = -11110100 = -244 (desimaali) 220 11011100 - (00100011 + 1) = -00100100 = -36 (desimaali) Huomaa: Ylivuoto jätetään huomiotta laskettaessa 2: n komplementtia.
35: n bittikommentti on 220 (desimaalilla). 2: n komplementti 220: sta on -36. Siksi lähtö on -36 220: n sijaan.
5. shl
shl
Toiminto siirtyy bitin kuviota vasemmalle, jonka tietty määrä tietyn bittiä, ja nolla bittiä siirtynyt matalan asteen sijainneissa.
212 (binaarina: 11010100) 212 shl 1: n arvo on 424 (binaarisena: 110101000) 212 shl 0: n arvo on 212 (binaarisena: 11010100) 212 shl 4: n arvona 3392 (binäärisenä: 110101000000)
Esimerkki: Vasen siirtymä bittiä kohti
fun main(args: Array) ( val number = 212 println(number shl 1) println(number shl 0) println(number shl 4) )
Kun suoritat ohjelmaa, tulos on:
424 212 3392
6. shr
shr
Toiminto siirtyy puri pattery verran oikealle certin määrä määritetty bittejä.
212 (binäärimuodossa: 11010100) 212 shr 1 arvoksi 106 (binäärissä: 01101010) 212 shr 0 arvoksi 212 (binäärissä: 11010100) 212 shr 8 arvoksi 0 (binäärissä: 00000000)
Jos numero on 2: n komplementtimerkkiluku, merkkibitti siirretään korkean asteen asemiin.
fun main(args: Array) ( val number = 212 println(number shr 1) println(number shr 0) println(number shr 8) )
Kun suoritat ohjelmaa, ouput on:
106 212 0
7. ushr
ushr
Toiminto siirtyy nollaa osaksi vasemmalla oleva.
Esimerkki: allekirjoitettu ja allekirjoittamaton oikea vaihto
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) )
Kun suoritat ohjelmaa, tulos on:
2 2-3 2147483645
Huomaa, kuinka allekirjoitettu ja allekirjoittamaton oikea siirtofunktio toimii eri tavalla 2: n täydennysosassa.
2: n täydennysosa 2147483645
on 3
.