Kotlin erbjuder flera funktioner (i infixform) för att utföra bitvis och bitförskjutning. I den här artikeln lär du dig att utföra bitnivåoperation i Kotlin med hjälp av exempel.
Bitvisa och bitförskjutningsoperatorer används på endast två integraltyper ( Int
och Long
) för att utföra bitnivåoperationer.
För att utveckla dessa operationer tillhandahåller Kotlin 7 funktioner med infixnotation.
1. eller
Den or
funktionen jämför motsvarande bitar av två värden. Om någon av bitarna är 1, ger den 1. Om inte, ger den 0. Till exempel,
12 = 00001100 (i binär) 25 = 00011001 (i binär) bitvis ELLER användning av 12 och 25 00001100 eller 00011001 ________ 00011101 = 29 (i decimal)
Exempel: Bitvis eller drift
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 or number2 // result = number1.or(number2) println(result) )
När du kör programmet blir resultatet:
29
2. och
Den and
funktionen jämför motsvarande bitar av två värden. Om båda bitarna är 1 utvärderas den till 1. Om någon av bitarna är 0 utvärderas den till 0. Till exempel
12 = 00001100 (i binär) 25 = 00011001 (i binär) bitoperation på 12 och 25 00001100 och 00011001 ________ 00001000 = 8 (i decimal)
Exempel: Bitvis och drift
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 and number2 // result = number1.and(number2) println(result) )
När du kör programmet blir resultatet:
8
3. xor
Den xor
funktionen jämför motsvarande bitar av två värden. Om motsvarande bitar är olika ger det 1. Om motsvarande bitar är desamma ger det 0. Till exempel,
12 = 00001100 (i binär) 25 = 00011001 (i binär) bitvis ELLER användning av 12 och 25 00001100 xor 00011001 ________ 00010101 = 21 (i decimal)
Exempel: Bitvis xor drift
fun main(args: Array) ( val number1 = 12 val number2 = 25 val result: Int result = number1 xor number2 // result = number1.xor(number2) println(result) )
När du kör programmet blir resultatet:
21
4. inv ()
Funktionen inv () inverterar bitmönstret. Det gör varje 0 till 1 och var 1 till 0.
35 = 00100011 (i binär) Bitvis komplement Användning av 35 00100011 ________ 11011100 = 220 (i decimal)
Exempel: Bitvis komplement
fun main(args: Array) ( val number = 35 val result: Int result = number.inv() println(result) )
När du kör programmet blir resultatet:
-36
Varför får vi output -36 istället för 220?
Det beror på att kompilatorn visar 2: s komplement av det numret; negativ notering av det binära numret.
För alla heltal n kommer 2: s komplement av n att vara -(n+1)
.
Decimalt binärt 2-komplement --------- --------- ---------------------------- ----------- 0 00000000 - (11111111 + 1) = -00000000 = -0 (decimal) 1 00000001 - (11111110 + 1) = -11111111 = -256 (decimal) 12 00001100 - (11110011 +1) = -11110100 = -244 (decimal) 220 11011100 - (00100011 + 1) = -00100100 = -36 (decimal) Obs! Överflöde ignoreras vid beräkning av 2: s komplement.
Det bitvisa komplementet på 35 är 220 (i decimal). 2: s komplement på 220 är -36. Följaktligen är utdata -36 istället för 220.
5. shl
De shl
funktions skift bitmönster till vänster genom visst antal specificerade bitar och noll-bitar skiftas in i de lägre ordning positioner.
212 (I binär: 11010100) 212 shl 1 utvärderas till 424 (I binär: 110101000) 212 shl 0 utvärderas till 212 (I binär: 11010100) 212 shl 4 utvärderas till 3392 (I binär: 110101000000)
Exempel: Bitvis vänster skift
fun main(args: Array) ( val number = 212 println(number shl 1) println(number shl 0) println(number shl 4) )
När du kör programmet blir resultatet:
424 212 3392
6. shr
De shr
funktions skiftar lite pattery till höger genom certin antal specificerade bitar.
212 (I binär: 11010100) 212 shr 1 utvärderas till 106 (I binär: 01101010) 212 shr 0 utvärderas till 212 (I binär: 11010100) 212 shr 8 utvärderas till 0 (I binär: 00000000)
Om numret är ett 2: s komplement undertecknat nummer flyttas teckenbiten till högordenspositionerna.
fun main(args: Array) ( val number = 212 println(number shr 1) println(number shr 0) println(number shr 8) )
När du kör programmet blir utgången:
106 212 0
7. ushr
De ushr
funktions skift noll i läget längst till vänster.
Exempel: signerad och osignerad Right Shift
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) )
När du kör programmet blir resultatet:
2 2 -3 2147483645
Observera hur signerad och osignerad högerskiftfunktion fungerar annorlunda för 2: s komplement.
2: s komplement av 2147483645
är 3
.