如何在 Kotlin 中获取 Int 的二进制表示

58

有没有一种方法可以用来获取整数的二进制表示?例如,当提供: 0 给出 0 4 给出 100 22 给出 10110

6个回答

75

5
注意负数。(-2).toString(2) 将返回 -10 而不是 11111111111111111111111111111110。因此,你得到的是 二进制数 中的数字,而不是其 补码 位表示。 - Ilya
1
@ilya 那我们如何处理负整数呢? - Rashi Karanpuria
@RashiKaranpuria,你必须使用字符串表示中的负号来解释该信息。由于2的补码目前不可用,我认为没有其他干净的管理方式。如果我漏掉了什么,请llya指正。(我是Kotlin的新手,可能在某个地方漏掉了细节) - phoenix
1
如果你想要前导零:Integer.toBinaryString(1).padStart(Int.SIZE_BITS, '0')(已添加更详细的答案)。 - Adam Millerchip
@RashiKaranpuria 要得到二进制补码表示,您可以执行 a.xor(4294967295),其中 4294967295 是所有位都为1的数字(即1111...1)。 - Albert Bikeev

35

从Kotlin 1.3开始,可以通过将有符号整数重新解释为无符号整数并将其转换为二进制字符串来获得其二进制表示:


a.toUInt().toString(radix = 2)

从1.4版本开始,这仍然会生成警告“此声明是实验性的,其使用应标记为'@kotlin.ExperimentalUnsignedTypes”。 - Adam Millerchip
这是最佳解决方案。 - david.barkhuizen

13

我需要一个函数,它能打印出整数的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')
        }
}

3

我正在使用这种方法将整数转换为二进制:

fun Int.toBinary(len: Int): String {
    return String.format("%" + len + "s", this.toString(2)).replace(" ".toRegex(), "0")
}

使用以下方式调用此方法,numberToBeConvert.toBinary(length)

4.toBinary(8) = 00000100

1
如果您想使用纯Kotlin,且二进制表示必须具有固定长度。例如,如果您想要得到 00111111(63),可以这样做:
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。但是,请确保将其与无符号类型一起使用。


1

如果你有比整数更大的数字,你可以使用BigInteger。

val binaryString = BigInteger("12345678987654321").toString(2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接