在 Java 和 Kotlin 中,位运算符及其功能是相似的。这些运算符用于对二进制位执行操作,如按位与(AND)、按位或(OR)、按位异或(XOR)、按位非(NOT)和位移(左移、右移、无符号右移)。
以下是 Java 和 Kotlin 中位运算符的对应关系:
Java 位运算符
&(按位与)|(按位或)^(按位异或)~(按位非)<<(左移)>>(有符号右移)>>>(无符号右移,仅在 Java 中可用)
Kotlin 位运算符
and(对应 Java 的&)or(对应 Java 的|)xor(对应 Java 的^)inv(没有直接的按位非运算符,但你可以使用x.inv()来获取-x - 1,这等效于对无符号整数进行按位非操作)shl(对应 Java 的<<)shr(对应 Java 的>>)ushr(对应 Java 的>>>)
注意:Kotlin 没有直接的按位非运算符,但你可以使用 inv 函数来获取一个数值的按位非结果(对于无符号整数)。然而,inv 实际上返回的是 -x - 1,这在有符号整数的上下文中可能与按位非不完全相同。
示例
Java
int a = 60; /* 60 = 0011 1100 */
int b = 13; /* 13 = 0000 1101 */
int c = 0;
c = a & b; /* 12 = 0000 1100 */
c = a | b; /* 61 = 0011 1101 */
c = a ^ b; /* 49 = 0011 0001 */
c = ~a; /*-61 = 1100 0011 */
c = a << 2; /* 240 = 1111 0000 */
c = a >> 2; /* 15 = 0000 1111 */
c = a >>> 2; /* 15 = 0000 1111 */
Kotlin
val a = 60.toInt() /* 60 = 0011 1100 */
val b = 13.toInt() /* 13 = 0000 1101 */
var c = 0
c = a and b /* 12 = 0000 1100 */
c = a or b /* 61 = 0011 1101 */
c = a xor b /* 49 = 0011 0001 */
// 注意:Kotlin 没有直接的按位非运算符,但可以使用 inv() 函数
// val cInv = a.inv() // 这将返回 -61 的二进制补码表示
c = a shl 2 /* 240 = 1111 0000 */
c = a shr 2 /* 15 = 0000 1111 */
c = a ushr 2 /* 15 = 0000 1111 */
注意:在 Kotlin 中,当你处理字面量时,它们默认是 Int 类型的,所以通常不需要显式地调用 .toInt()。但在上面的示例中,我为了明确性而添加了它。