Kotlin `shl` 不工作
Kotlin `shl` not working
我正在尝试将 shl
应用于 Kotlin 中的 Int
值:
val a = 1092455
println(a.toString())
println(toString(bits(one)))
println(toString(bits(one shl 16)))
println(toString(bits(one shr 16)))
这会产生以下输出:
1092455
0000000000010000 1010101101100111
0000000000000000 0000000000000000
0000000000000000 0000000000010000
如您所见,shr
正确地导致最左边的 16 位 (0000000000010000
) 向右移动,但是 shl
没有给出预期的输出 (1010101101100111 0000000000000000
).
我错过了什么?
编辑:bits
方法:
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
}
Kotlin 中的数值是有符号的,当你向左移动时,数值会溢出成负数。那么您正在使用的 bits
的实现无法正确打印这些位。
以下是它对我的作用:
val a = 1092455
println((a shr 16).toString(2))
println((a shl 15).toString(2))
println((a shl 16).toString(2))
打印:
10000
1010101101100111000000000000000
-1010100100110010000000000000000
我觉得这很合理。
要修复您的代码,请使用 Long
值:
val a: Long = 1092455
我正在尝试将 shl
应用于 Kotlin 中的 Int
值:
val a = 1092455
println(a.toString())
println(toString(bits(one)))
println(toString(bits(one shl 16)))
println(toString(bits(one shr 16)))
这会产生以下输出:
1092455
0000000000010000 1010101101100111
0000000000000000 0000000000000000
0000000000000000 0000000000010000
如您所见,shr
正确地导致最左边的 16 位 (0000000000010000
) 向右移动,但是 shl
没有给出预期的输出 (1010101101100111 0000000000000000
).
我错过了什么?
编辑:bits
方法:
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
}
Kotlin 中的数值是有符号的,当你向左移动时,数值会溢出成负数。那么您正在使用的 bits
的实现无法正确打印这些位。
以下是它对我的作用:
val a = 1092455
println((a shr 16).toString(2))
println((a shl 15).toString(2))
println((a shl 16).toString(2))
打印:
10000
1010101101100111000000000000000
-1010100100110010000000000000000
我觉得这很合理。
要修复您的代码,请使用 Long
值:
val a: Long = 1092455