Kotlin位移

时间:2018-01-31 22:05:23

标签: kotlin bit-shift

如果对Kotlin的答案为https://stackoverflow.com/a/5402769/2735398

,我想转换代码

我把它粘贴到Intellij:

private int decodeInt() {
    return ((bytes[pos++] & 0xFF) << 24) | ((bytes[pos++] & 0xFF) << 16)
            | ((bytes[pos++] & 0xFF) << 8) | (bytes[pos++] & 0xFF);
}

Intellij问我是否要将其转换为Kotlin,当我这样做是输出:

private fun decodeInt(): Int {
    return (bytes[pos++] and 0xFF shl 24 or (bytes[pos++] and 0xFF shl 16)
            or (bytes[pos++] and 0xFF shl 8) or (bytes[pos++] and 0xFF))
}

完全0xFF我收到此错误:

The integer literal does not conform to the expected type Byte

通过在其后添加.toByte(),我可以删除此错误。

在所有轮班离开操作(shl)时,我收到此错误:

Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: 

@SinceKotlin @InlineOnly public infix inline fun BigInteger.shl(n: Int): BigInteger defined in kotlin

我无法解决这个问题...... 我不太了解Java / Kotlin中的位移...... Kotlin的代码是什么?

2 个答案:

答案 0 :(得分:5)

明确转换如下:0xFF.toByte()

作为一般规则,当您需要有关错误或可能的解决方案的更多信息时,请按Alt + Enter。

左移方法采用Int作为参数。所以,同样的事情,转换为正确的类型。

(bytes[pos++] and 0xFF.toByte()).toInt() shl 24

答案 1 :(得分:1)

shl期望Int,而不是Byte。你需要0xFF作为Int(它是),所以不要调用toByte()。你需要(0xFF shl 24)成为一个Int,所以不要转换它。你需要bytes[pos++]成为Int ..转换它!

return (((bytes[pos++].toInt() and (0xFF shl 24)) or
         (bytes[pos++].toInt() and (0xFF shl 16)) or
         (bytes[pos++].toInt() and (0xFF shl 8)) or
         (bytes[pos++].toInt() and 0xFF))