Kotlin Bitwise- ja Bitshift-toiminnot (esimerkkien avulla)

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ä ( Intja Long) bittitason operaatioiden suorittamiseksi.

Näiden toimintojen suorittamiseksi Kotlin tarjoaa 7 toimintoa infix-merkintöjen avulla.

1. tai

orToiminto 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

andToiminto 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

xorToiminto 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

shlToiminto 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

shrToiminto 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

ushrToiminto 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 2147483645on 3.

Mielenkiintoisia artikkeleita...