1. 概述

在实际开发中,我们有时会遇到需要处理二进制数的情况,比如进行二进制运算或转换。这种场景下,开发者通常需要在二进制与十进制之间进行转换。

本文将介绍在 Kotlin 中如何将二进制数转换为十进制数,以及反过来如何将十进制数转换为二进制数。我们将展示自定义实现和 Kotlin(或 Java)标准库中已有的方法。

2. 二进制转十进制

首先明确几个基本概念:

  • 二进制数:是以 2 为基数的数,由数字 0 和 1 组成。
  • 十进制数:是以 10 为基数的数,由数字 0 到 9 组成。

2.1 自定义算法实现

我们可以手动实现一个算法来完成二进制到十进制的转换:

  • 将二进制字符串反转,这样我们可以从右往左处理每一位。
  • 对于每一位,计算其十进制贡献值:bit × 2^i,其中 i 是当前位的索引。
  • 将所有贡献值累加得到最终结果。

代码如下:

fun binaryToDecimal(binary: String): Int {
    val reversedDigits = binary.reversed().toCharArray().map { it.digitToInt() }
    var decimalNumber = 0
    var i = 0

    for (n in reversedDigits) {
        decimalNumber += (n * 2.0.pow(i)).toInt()
        ++i
    }
    return decimalNumber
}

测试用例如下:

@Test
fun `binary to decimal mathematical approach`() {
    assertEquals(439, binaryToDecimal("110110111"))
    assertEquals(109, binaryToDecimal("1101101"))
    assertEquals(27, binaryToDecimal("11011"))
    assertEquals(122979, binaryToDecimal("11110000001100011"))
    assertEquals(12, binaryToDecimal("1100"))
    assertEquals(98, binaryToDecimal("1100010"))
}

✅ 这种方法逻辑清晰,适合理解底层原理,但不推荐在实际项目中使用,因为有更简洁的方式。

2.2 使用 toInt() 方法(推荐)

Kotlin 提供了字符串直接转换为整数的方法,并支持指定进制(radix):

"110110111".toInt(2)

传入 2 表示该字符串是二进制表示的数。这种方式简洁高效,是实际开发中首选方案。

测试用例如下:

@Test
fun `binary to decimal using toInt() method`() {
    assertEquals(439, "110110111".toInt(2))
    assertEquals(109, "1101101".toInt(2))
    assertEquals(27, "11011".toInt(2))
    assertEquals(122979, "11110000001100011".toInt(2))
    assertEquals(12, "1100".toInt(2))
    assertEquals(98, "1100010".toInt(2))
}

✅ 推荐在实际开发中使用此方法,简洁、高效、不易出错。

3. 十进制转二进制

接下来我们看看如何将十进制数转换为二进制数。

3.1 自定义算法实现

基本思路是:

  • 使用一个列表来存储每次除以 2 得到的余数。
  • 每次除以 2 后更新原数值。
  • 当数值小于等于 0 时停止循环。
  • 最后将余数列表反转,得到最终的二进制字符串。

实现代码如下:

fun decimalToBinary(n: Int): String {
    val intList = mutableListOf<Int>()
    var decimalNumber = n

    while (decimalNumber > 0) {
        intList.add(decimalNumber % 2)
        decimalNumber /= 2
    }
    return intList.reversed().joinToString("")
}

测试用例如下:

@Test
fun `decimal to binary mathematical approach`() {
    assertEquals("110110111", decimalToBinary(439))
    assertEquals("1101101", decimalToBinary(109))
    assertEquals("11011", decimalToBinary(27))
    assertEquals("1100", decimalToBinary(12))
    assertEquals("1100010", decimalToBinary(98))
}

✅ 这种方式适合理解原理,但不推荐用于生产环境。

3.2 使用 Integer.toBinaryString() 方法(推荐)

Java 提供了将整数转换为二进制字符串的工具方法 Integer.toBinaryString(),这个方法在 Kotlin 中也可以直接使用:

Integer.toBinaryString(439)

测试用例如下:

@Test
fun `decimal to binary using toBinaryString() method`() {
    assertEquals("110110111", Integer.toBinaryString(439))
    assertEquals("1101101", Integer.toBinaryString(109))
    assertEquals("11011", Integer.toBinaryString(27))
    assertEquals("1100", Integer.toBinaryString(12))
    assertEquals("1100010", Integer.toBinaryString(98))
}

✅ 这是最简洁、最可靠的方式,推荐在项目中使用。

4. 总结

本文介绍了在 Kotlin 中如何实现二进制与十进制之间的相互转换:

转换方向 推荐方法 备注
二进制 → 十进制 "binary".toInt(2) 简洁、高效
十进制 → 二进制 Integer.toBinaryString() Java 原生方法,Kotlin 可直接使用

如果你只是需要快速转换,建议直接使用 Kotlin 或 Java 提供的标准方法。自定义实现适合用于学习二进制转换的底层原理。

完整代码示例和测试用例可以在 GitHub 上找到。


原始标题:Convert Binary Number to Decimal and Vice Versa in Kotlin