有没有一种方法可以用来获取整数的二进制表示?例如,当提供: 0 给出 0 4 给出 100 22 给出 10110
方法1:
使用Integer.toBinaryString(a)
,其中a
是一个Int。此方法来自Java平台,可在Kotlin中使用。
在https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#toBinaryString(int)上查找有关此方法的更多信息。
注意:此方法适用于正整数和负整数。
方法2:
使用a.toString(2)
,其中a
是一个Int,2
是基数。
注意:此方法仅适用于正整数。
从Kotlin 1.3开始,可以通过将有符号整数重新解释为无符号整数并将其转换为二进制字符串来获得其二进制表示:
a.toUInt().toString(radix = 2)
我需要一个函数,它能打印出整数的32位二进制表示。其他答案中提到的标准库函数不能做到这一点。然而,正如Rashi Karanpuria所指出的那样,可以通过结合Integer.toBinaryString()
和Kotlin stdlib函数padStart()
来实现:
fun Int.to32bitString(): String =
Integer.toBinaryString(this).padStart(Int.SIZE_BITS, '0')
fun main() {
println(Int.MIN_VALUE.to32bitString())
println((-1).to32bitString())
println(0.to32bitString())
println(1.to32bitString())
println(Int.MAX_VALUE.to32bitString())
}
输出:
10000000000000000000000000000000
11111111111111111111111111111111
00000000000000000000000000000000
00000000000000000000000000000001
01111111111111111111111111111111
如果您无法访问 Integer.toBinaryString()
,则可以使用等效的方法:Int.toString(2)
对于正整数效果很好,但它不会打印前导零,并保留符号((-1).toString(2)
返回 "-1"
而不是由多个 1
位组成的字符串)。如果我们将整数的各个字节移至最低有效字节,则该值始终为正。我们可以使用 Int.toString(2)
来获取每个字节的表示,然后重新将它们组合在一起(对于 Long
也适用):
fun Int.toBinaryString(): String = let { int ->
IntProgression
.fromClosedRange(rangeStart = Int.SIZE_BITS - 8, rangeEnd = 0, step = -8)
.joinToString("") { bytePos ->
(int shr bytePos and 0xFF).toString(2).padStart(8, '0')
}
}
我正在使用这种方法将整数转换为二进制:
fun Int.toBinary(len: Int): String {
return String.format("%" + len + "s", this.toString(2)).replace(" ".toRegex(), "0")
}
使用以下方式调用此方法,numberToBeConvert.toBinary(length)
4.toBinary(8) = 00000100
fun UByte.toBinary(): String {
return buildString(8) {
val binaryStr = this@toBinary.toString(2)
val countOfLeadingZeros = 8 - binaryStr.count()
repeat(countOfLeadingZeros) {
append(0)
}
append(binaryStr)
}
}
您可以修改该代码以使用UInt。但是,请确保将其与无符号类型一起使用。
如果你有比整数更大的数字,你可以使用BigInteger。
val binaryString = BigInteger("12345678987654321").toString(2)
(-2).toString(2)
将返回-10
而不是11111111111111111111111111111110
。因此,你得到的是 二进制数 中的数字,而不是其 补码 位表示。 - IlyaInteger.toBinaryString(1).padStart(Int.SIZE_BITS, '0')
(已添加更详细的答案)。 - Adam Millerchipa.xor(4294967295)
,其中4294967295
是所有位都为1的数字(即1111...1)。 - Albert Bikeev