Kotlin提供了幾種函數(shù)(以 infix 形式)來執(zhí)行按位和移位操作。在本文中,您將借助示例學習在Kotlin中執(zhí)行位級操作。
僅在兩種整數(shù)類型(Int和Long)上使用按位運算符和位移位運算符來執(zhí)行位級運算。
為了執(zhí)行這些操作,Kotlin提供了7個使用中綴符號的函數(shù)。
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 函數(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函數(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()函數(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函數(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函數(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函數(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。