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

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

【问题讨论】:

    标签: kotlin binary bit


    【解决方案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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-31
          • 2019-02-04
          • 1970-01-01
          • 1970-01-01
          • 2013-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多