Kotlin 按位和移位操作

Kotlin提供了幾種函數(shù)(以 infix 形式)來執(zhí)行按位和移位操作。在本文中,您將借助示例學習在Kotlin中執(zhí)行位級操作。

僅在兩種整數(shù)類型(Int和Long)上使用按位運算符和位移位運算符來執(zhí)行位級運算。

為了執(zhí)行這些操作,Kotlin提供了7個使用中綴符號的函數(shù)。

按位或 (or)

or函數(shù)比較兩個值的相應位。如果兩個位中的任何一個為1,則為1。否則為0。例如,

12 = 00001100 (二進制)
25 = 00011001 (二進制)

12和25的按位或運算
   00001100 or
   00011001
   ________
   00011101  = 29 (十進制)

示例:按位或運算

fun main(args: Array<String>) {

    val number1 = 12
    val number2 = 25
    val result: Int

    result = number1 or number2   // result = number1.or(number2)
    println(result)
}

運行該程序時,輸出為:

29

按位與(and)

and 函數(shù)比較兩個值的相應位。如果兩個位都為1,則求值為1。如果兩個位中的任意一個為0,則求值為0。例如,

12 = 00001100 (二進制)
25 = 00011001 (二進制)

12和25的按位與運算
   00001100 and
   00011001
   ________
   00001000  = 8 (十進制)

示例:按位與運算

fun main(args: Array<String>) {

    val number1 = 12
    val number2 = 25
    val result: Int

    result = number1 and number2   // result = number1.and(number2)
    println(result)
}

運行該程序時,輸出為:

8

按位異或(xor)

xor函數(shù)比較兩個值的相應位。如果相應的位不同,則為1。如果相應的位相同,則為0。例如,

12 = 00001100 (二進制)
25 = 00011001 (二進制)

12和25的按位異或運算
   00001100 xor
   00011001
   ________
   00010101  = 21 (十進制)

示例:按位異或運算

fun main(args: Array<String>) {

    val number1 = 12
    val number2 = 25
    val result: Int

    result = number1 xor number2   // result = number1.xor(number2)
    println(result)
}

運行該程序時,輸出為:

21

按位非  inv()

inv()函數(shù)按位非。它使每個0 到 1,以及每個 1 到 0。

35 = 00100011 (二進制)

35的按位補碼運算
  00100011 
  ________
  11011100  = 220 (十進制)

示例:按位補碼

fun main(args: Array<String>) {

    val number = 35
    val result: Int

    result = number.inv()
    println(result)
}

運行該程序時,輸出為:

-36

我們?yōu)槭裁匆敵?nbsp;-36 代替 220

這是因為編譯器顯示了該數(shù)字的2的補碼。二進制數(shù)的負號。

對于任何整數(shù)n,n的2的補數(shù)將為-(n + 1)。

 Decimal         Binary                      2's complement
---------       ---------          ---------------------------------------  
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)

Note: Overflow is ignored while computing 2's complement.

35的按位補碼為220(十進制)。220的2的補碼是-36。因此,輸出是-36而不是220。

左移運算符 (shl)

shl函數(shù)將位模式向左移動一定數(shù)量的指定位,并且零位被移到低位位置。

212 (二進制: 11010100)

212 shl 1 evaluates to 424 (二進制: 110101000)
212 shl 0 evaluates to 212 (二進制: 11010100)
212 shl 4 evaluates to 3392 (二進制: 110101000000)

示例:按位左移

fun main(args: Array<String>) {
    val number = 212

    println(number shl 1)
    println(number shl 0)
    println(number shl 4)
}

運行該程序時,輸出為:

424
212
3392

右移運算符(shr)

shr函數(shù)將位模式向右移位指定位數(shù)。

212 (二進制: 11010100)

212 shr 1 計算為 106 (二進制: 01101010)
212 shr 0 計算為 212 (二進制: 11010100)
212 shr 8 計算為 0 (二進制: 00000000)

如果該數(shù)字是2的補號,則將標志位移到高位位置。

fun main(args: Array<String>) {
    val number = 212

    println(number shr 1)
    println(number shr 0)
    println(number shr 8)
}

當您運行該程序時,輸出將是:

106
212
0

無符號右移運算符(ushr)

ushr函數(shù)將零移位到最左邊的位置。

示例:有符號和無符號右移

fun main(args: Array<String>) {
    val number1 = 5
    val number2 = -5

    //有符號右移
    println(number1 shr 1)

    //無符號右移
    println(number1 ushr 1)

    //有符號右移
    println(number2 shr 1)

    //無符號右移
    println(number2 ushr 1)
}

運行該程序時,輸出為:

2
2
-3
2147483645

注意,對于2的補碼,有符號右移函數(shù)和無符號右移函數(shù)的工作方式是不同的。

2147483645的2的補碼是3。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清