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

Posted

技术标签:

【中文标题】如何在 Kotlin 中获取 Int 的二进制表示【英文标题】:How to get binary representation of Int in Kotlin 【发布时间】:2018-10-14 19:54:11 【问题描述】:

有没有一种方法可以用来获取整数的位表示?例如,当提供时: 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)了解更多关于这个方法的信息

注意:此方法适用于正整数和负整数。

方法二: 使用a.toString(2),其中a 是一个Int,2 是基数 注意:此方法仅适用于正整数。

【讨论】:

不过要小心负数。 (-2).toString(2) 将是 -10 而不是 11111111111111111111111111111110。所以你会得到base-2 numeral system 中的数字,而不是它的2-complement 位表示。 @ilya 那么我们如何处理负整数呢? @RashiKaranpuria 您必须使用字符串表示中的负号来解释该信息。由于 2 的补码不可用(至少现在),我认为没有其他方法可以干净地管理它。如果我遗漏了什么,请纠正我。 (我是 Kotlin 的新手,可能在某处错过了细则) 如果您想要前导零:Integer.toBinaryString(1).padStart(Int.SIZE_BITS, '0')(添加了更多详细信息的答案)。【参考方案2】:

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

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

【讨论】:

从 1.4 开始,这仍会生成警告 This declaration is experimental and its usage should be marked with '@kotlin.ExperimentalUnsignedTypes 这是最好的解决方案【参考方案3】:

我想要一个能打印出整数所有位的 32 位二进制表示的函数。其他答案中提到的标准库函数不这样做。但是,可以通过将 Integer.toBinaryString() 与 Rashi Karanpuria 指出的 Kotlin 标准库函数 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')
        

【讨论】:

【参考方案4】:

我就是用这个方法把整数转成二进制的,

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

这样调用这个方法, numberToBeConvert.toBinary(长度)

4.toBinary(8) = 00000100

【讨论】:

【参考方案5】:

如果您的数字大于 Integer,则可以使用 BigInteger。

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

【讨论】:

以上是关于如何在 Kotlin 中获取 Int 的二进制表示的主要内容,如果未能解决你的问题,请参考以下文章

如何在Kotlin中获取数据类型

Kotlin使用window.fetch API获取二进制数据

如何将表示二进制的 int 向量转换为表示十进制数的 int 向量? C++

如何在可扩展列表视图 Kotlin 中获取标题中的子项计数

如何在 kotlin 中将纪元时间戳转换为 unix 十六进制时间戳?

如何在 Kotlin 中将 String 转换为 Int?