Kotlin Bitwise és Bitshift műveletek (példákkal)

Kotlin számos funkciót biztosít (infix formában) a bitenkénti és a bitváltási műveletek végrehajtásához. Ebben a cikkben megtanulod végrehajtani a bitszintű műveleteket Kotlinban példák segítségével.

A bitenkénti és a biteltolás operátorokat csak két integrált típusnál ( Intés Long) használják bites szintű műveletek végrehajtására.

Ezen műveletek elvégzéséhez Kotlin 7 függvényt biztosít infix jelöléssel.

1. vagy

A orfüggvény két érték megfelelő bitjeit hasonlítja össze. Ha bármelyik bit 1, akkor 1-et ad. Ha nem, akkor 0-at ad. Például

 12 = 00001100 (bináris formátumban) 25 = 00011001 (bináris formátumban) Bitenként VAGY a 12 és 25 művelete 00001100 vagy 00011001 ________ 00011101 = 29 (tizedesjegyben)

Példa: bitenként vagy művelet

 fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 or number2 // result = number1.or(number2) println(result) )

A program futtatásakor a kimenet a következő lesz:

 29.

2. és

A andfüggvény két érték megfelelő bitjeit hasonlítja össze. Ha mindkét bit 1, akkor 1-re értékelik. Ha bármelyik bit 0, akkor 0-ra értékelik. Például

 12 = 00001100 (bináris formátumban) 25 = 00011001 (bináris formában) 12 és 25 bitművelet 00001100 és 00011001 ________ 00001000 = 8 (tizedesjegyben)

Példa: Bitenkénti és működés

 fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 and number2 // result = number1.and(number2) println(result) )

A program futtatásakor a kimenet a következő lesz:

 8.

3. xor

A xorfüggvény két érték megfelelő bitjeit hasonlítja össze. Ha a megfelelő bitek különböznek, akkor 1-et ad. Ha a megfelelő bitek megegyeznek, akkor 0-at ad. Például

 12 = 00001100 (bináris formátumban) 25 = 00011001 (bináris formátumban) Bitenként VAGY a 12 és 25 művelete 00001100 xor 00011001 ________ 00010101 = 21 (tizedesjegyben)

Példa: Bitenként xor művelet

 fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 xor number2 // result = number1.xor(number2) println(result) )

A program futtatásakor a kimenet a következő lesz:

 21

4. inv ()

Az inv () függvény megfordítja a bitmintát. Minden 0-tól 1-ig és 1-től 0-ig változik.

 35 = 00100011 (bináris formátumban) A 35 00100011 művelete bitenként, ________ 11011100 = 220 (tizedesjegyben)

Példa: Bitenkénti kiegészítés

 fun main(args: Array) ( val number = 35 val result: Int result = number.inv() println(result) )

A program futtatásakor a kimenet a következő lesz:

 -36

Miért kapjuk a kimenetet -36 helyett 220?

Ez azért van, mert a fordító megmutatja ennek a számnak a két kiegészítését; a bináris szám negatív jelölése.

Bármely n egész szám esetén n értéke 2 komplementere lesz -(n+1).

 Tizedes bináris 2 komplementje --------- --------- ---------------------------- ----------- 0 00000000 - (11111111 + 1) = -00000000 = -0 (tizedes) 1 00000001 - (11111110 + 1) = -11111111 = -256 (tizedes) 12 00001100 - (11110011 +1) = -11110100 = -244 (decimális) 220 11011100 - (00100011 + 1) = -00100100 = -36 (decimális) Megjegyzés: A túlfolyást figyelmen kívül hagyják a 2. kiegészítés kiszámításakor.

A 35 bitenkénti komplementere 220 (tizedesjegyben). A 2-es komplementer értéke 220 -36. Ezért a kimenet 220 helyett -36.

5. shl

A shlfüggvény a bitmintát bizonyos számú megadott bit által balra tolja, és nulla bit eltolódik az alacsony rendû pozíciókba.

 212 (binárisan: 11010100) 212 shl 1 értéke 424 (binárisan: 110101000) 212 shl 0 értéke 212 (binárisan: 11010100) 212 shl 4 értéke 3392 (binárisan: 110101000000)

Példa: Balra balra tolás

 fun main(args: Array) ( val number = 212 println(number shl 1) println(number shl 0) println(number shl 4) )

A program futtatásakor a kimenet a következő lesz:

 424 212 3392

6. shr

A shrfüggvény a bitek tapintását jobbra tolja a megadott bitek certinszámával.

 212 (binárisan: 11010100) 212 shr 1 érték 106-ra (binárisan: 01101010) 212 shr 0 érték 212-re (binárisan: 11010100) 212 shr 8 érték 0-ra (binárisan: 00000000)

Ha a szám 2-es kiegészítéssel aláírt szám, akkor az előjelbit a magas rendű pozíciókba tolódik.

 fun main(args: Array) ( val number = 212 println(number shr 1) println(number shr 0) println(number shr 8) )

A program futtatásakor az ouput a következő lesz:

 106 212 0

7. ushr

A ushrfüggvény nullát tol a bal szélső helyzetbe.

Példa: aláírt és aláíratlan Jobb váltás

 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) )

A program futtatásakor a kimenet a következő lesz:

 2 2 -3 2147483645

Figyelje meg, hogy az aláírt és az alá nem írt jobb váltás funkció hogyan működik másképp a 2-es kiegészítésnél.

A 2 kiegészítése 2147483645az 3.

érdekes cikkek...