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 上找到。