如何在 Kotlin 中使用 Java 的位运算符?

77

Java有按位或运算符|按位与运算符&

int a = 5 | 10;
int b = 5 & 10;

它们似乎在 Kotlin 中无法正常工作:

val a = 5 | 10;
val b = 5 & 10;

我该如何在Kotlin中使用Java的位运算符?


3
|=是什么意思? - IgorGanapolsky
2
对于所有需要在 Kotlin 中使用位运算符的人:请投票支持 https://youtrack.jetbrains.com/issue/KT-1440 - elect
4个回答

96

你已经为它们命名了函数。

来自Kotlin文档

按位运算由可以以中缀形式调用的函数表示。它们只能应用于IntLong

例如:

val x = (1 shl 2) and 0x000FF000

这里是位运算的完整列表:

shl(bits) – signed shift left (Java's <<)
shr(bits) – signed shift right (Java's >>)
ushr(bits) – unsigned shift right (Java's >>>)
and(bits) – bitwise and
or(bits) – bitwise or
xor(bits) – bitwise xor
inv() – bitwise inversion

11
请注意,位反转应该像5.inv()这样使用,而不像其他运算符一样用作中缀操作符。 - xjcl
2
请注意,按位反转也称为按位补码或按位非。 - grian
3
我觉得很奇怪的是,Kotlin决定使用这些笨拙命名的函数来表示位运算符,而实际的布尔运算符如and和or仍然使用运算符。这有点反过来了,不是吗?如果可以的话,我希望这些符号保持不变,而布尔运算符变成单词。 - Hakanai
1
@Hakanai 非常同意。对我来说尤其困难的是,当我从像Python这样的语言转换过来时,我习惯于编写类似于if (condition1 or condition2) and condition3: do this这样的表达式。这种方式更直观,自然而易于理解。 - Anchith Acharya

25

你可以在 Kotlin 中做到这一点

val a = 5 or 10;
val b = 5 and 10;

以下是您可以使用的操作列表

shl(bits) – signed shift left (Java's <<)
shr(bits) – signed shift right (Java's >>)
ushr(bits) – unsigned shift right (Java's >>>)
and(bits) – bitwise and
or(bits) – bitwise or
xor(bits) – bitwise xor
inv() – bitwise inversion

1

0

另一个例子:

Java:

 byte dataHigh = (byte) ((data[byteOffset] & 0xF0) >> 4);

Kotlin

val d = (data[byteOffset] and 0xF0.toByte())
val dataHigh = (d.toInt() shr 4).toByte()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接