Tengo un byte. Lo que quiero hacer es acceder a la posición del bit para recuperar boolean (0 o 1). ¿Cómo puedo hacer eso en Kotlin?

fun getBit(b: Byte, bitNumber: Int): Boolean {
    val shift: Int = 7 - bitNumber
    val bitMask = (1 shl shift).toByte()

    val masked = (b and bitMask)
    return masked.toInt() != 0
}

Esto, por alguna razón, devuelve un valor incorrecto de falso cuando debería devolver verdadero

0
MaartinAndroid 26 oct. 2020 a las 13:10

1 respuesta

La mejor respuesta

Su algoritmo parece estar bien, creo que acaba de equivocarse por un error (aunque no dijo si está contando desde 0 o 1). Si lo cambio a

val shift: Int = 8 - bitNumber

Parece funcionarme bien:

fun getBit(b: Byte, bitNumber: Int): Boolean {
    require(bitNumber in 1..8)
    val shift: Int = 8 - bitNumber
    val bitMask = (1 shl shift).toByte()

    val masked = (b and bitMask)
    return masked.toInt() != 0
}

fun main() {
    println(getBit(0b10000000.toByte(), 1))
    println(getBit(0b10000000.toByte(), 2))
    println(getBit(0b01000000, 2))
}

Salida:

true
false
true

Nota: puede evitar el Byte.and() experimental utilizando Int.and() en su lugar:

val bitMask = (0b1 shl shift)
val masked = (b.toInt() and bitMask)
return masked != 0
2
Adam Millerchip 26 oct. 2020 a las 16:08