Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Kotlin bit shifting

I want to convert the code if this answer to Kotlin: https://stackoverflow.com/a/5402769/2735398

I pasted this into Intellij:

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

Intellij asks if I want to convert it to Kotlin, when I do this is the output:

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))
}

At all 0xFF I get this error:

The integer literal does not conform to the expected type Byte

By appending .toByte() after it I was able to remove this error.

And at all shift left operations(shl) I get this error:

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

I wasn't able to solve this one... I don't know a lot about bit shifting in Java/Kotlin...
What would be the working Kotlin code for this?

like image 738
Jan Wytze Avatar asked Jan 31 '18 22:01

Jan Wytze


2 Answers

Convert explicitly like this: 0xFF.toByte()

As a general rule, press Alt+Enter when you need more information about an error or a possible solution.

The shift left method takes an Int as parameter. So, same thing, convert to the right type.

(bytes[pos++] and 0xFF.toByte()).toInt() shl 24
like image 166
DPM Avatar answered Oct 03 '22 04:10

DPM


shl expects Int, not Byte. You need 0xFF to be an Int (which it is), so don't call toByte(). You need (0xFF shl 24) to be an Int, so don't convert that. You need bytes[pos++] to be an Int.. convert that!

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))
like image 40
Paul Hicks Avatar answered Oct 03 '22 05:10

Paul Hicks