2017-12-15 10 views
1

Ich bin versucht shl zu einem Int Wert in Kotlin anzuwenden:Kotlin `shl` funktioniert nicht

val a = 1092455 
println(a.toString()) 
println(toString(bits(one))) 
println(toString(bits(one shl 16))) 
println(toString(bits(one shr 16))) 

Dies erzeugt die folgende Ausgabe:

1092455 
0000000000010000 1010101101100111 
0000000000000000 0000000000000000 
0000000000000000 0000000000010000 

Wie Sie sehen können, shr richtig Die letzten 16 Bits (0000000000010000) werden nach rechts verschoben, shl gibt jedoch nicht die erwartete Ausgabe (1010101101100111 0000000000000000).

Was fehlt mir?

Edit: bits Methode:

fun bits(value: Int): BooleanArray { 
    var x = value.toDouble() 
    val result = BooleanArray (32) 

    for (i in 31 downTo 0) { 
     val d = Math.pow(2.0, i.toDouble()) 
     if (x >= d) { 
      x -= d 
      result[i] = true 
     } 
    } 

    return result 
} 
+0

könnten Sie bitte die 'bits' Implementierung zur Verfügung stellen? – voddan

+0

@voddan ah, nahm die 'Bits' Implementierung Signierung nicht in Betracht. Ffs – AesSedai101

+1

Sehen Sie, wie ich 'toString (2)' verwende, um die Zahlen in meiner Antwort zu drucken – voddan

Antwort

2

Numerische Werte werden in Kotlin unterzeichnet, um, wenn Sie den Wert verschieben links läuft über in die negativen Zahlen. Dann ist die Implementierung von bits, die Sie verwenden, nicht in der Lage, die Bits korrekt zu drucken.

Hier ist, wie es funktioniert für mich:

val a = 1092455 
println((a shr 16).toString(2)) 
println((a shl 15).toString(2)) 
println((a shl 16).toString(2)) 

Drucke:

10000 
1010101101100111000000000000000 
-1010100100110010000000000000000 

, die mir sinnvoll erscheint.

Um Ihren Code verwenden Long Werte fix:

val a: Long = 1092455 
Verwandte Themen