Python 十进制转二进制、八进制、十六进制(手把手讲解)

Python 十进制转二进制、八进制、十六进制:从入门到实战

你有没有遇到过这样的场景?在写代码时,突然需要把一个十进制数字转成二进制、八进制或十六进制?尤其是在处理底层数据、网络协议、内存地址、颜色值的时候,这些进制转换几乎是必备技能。今天我们就来系统地聊聊 Python 中如何高效完成这些转换,特别适合初学者快速上手,也适合中级开发者查漏补缺。

别担心,这些操作其实并不复杂。想象一下,十进制就像我们日常用的“十进制数”,而二进制、八进制、十六进制就像是“计算机世界的语言”。它们本质上都是表示数值的方式,只是“基数”不同而已。理解这一点,你就已经迈出了成功的第一步。


十进制与其它进制的关系

在开始编码之前,先来理清一个基本概念:进制。我们常用的十进制,每一位的权重是 10 的幂次,比如 123 = 1×10² + 2×10¹ + 3×10⁰。

而二进制是基于 2 的,每一位只能是 0 或 1,比如 1011 = 1×2³ + 0×2² + 1×2¹ + 1×2⁰ = 8 + 0 + 2 + 1 = 11(十进制)。

八进制是基于 8 的,每一位范围是 0~7。十六进制是基于 16 的,每一位可以是 0~9 和 A~F(其中 A=10, B=11, ..., F=15)。

虽然手动转换很费劲,但 Python 提供了非常简洁的方法,让我们一键完成转换,省时省力。


使用内置函数实现快速转换

Python 内置了 bin()oct()hex() 三个函数,专门用于十进制转二进制、八进制、十六进制。这是最推荐的方式,简单、高效、不容易出错。


decimal_number = 42

binary_result = bin(decimal_number)
print(f"十进制 {decimal_number} 转二进制: {binary_result}")

octal_result = oct(decimal_number)
print(f"十进制 {decimal_number} 转八进制: {octal_result}")

hex_result = hex(decimal_number)
print(f"十进制 {decimal_number} 转十六进制: {hex_result}")

💡 小贴士bin()oct()hex() 返回的字符串都带有前缀(0b0o0x),这是 Python 的标准表示法,方便识别进制类型。如果你不需要前缀,可以使用字符串切片去掉。


去掉前缀,获取纯数字字符串

有时候你只想保留数字部分,比如在做字符串拼接或写入文件时。这时候可以使用切片操作,去掉前缀。

decimal_value = 255

binary_clean = bin(decimal_value)[2:]
print(f"二进制(无前缀): {binary_clean}")

octal_clean = oct(decimal_value)[2:]
print(f"八进制(无前缀): {octal_clean}")

hex_clean = hex(decimal_value)[2:]
print(f"十六进制(无前缀): {hex_clean}")

✅ 说明:[2:] 表示从索引 2 开始取到结尾。因为 0b0o0x 都是两个字符,所以从第 3 个字符开始就是真正的数字部分。


手动实现转换逻辑(加深理解)

虽然 Python 提供了方便的函数,但理解背后的原理,才能真正掌握。下面我们来手动实现一个十进制转二进制的逻辑。

除以 2 取余法

这是最经典的二进制转换方法。原理是:不断除以 2,记录余数,直到商为 0。最后把余数倒过来排列,就是二进制结果。

def decimal_to_binary(decimal_num):
    # 处理特殊情况:0
    if decimal_num == 0:
        return "0"
    
    binary_digits = []  # 用于存储余数
    num = decimal_num  # 保留原始值用于计算
    
    # 循环:除以 2,记录余数
    while num > 0:
        remainder = num % 2  # 余数是 0 或 1
        binary_digits.append(str(remainder))
        num = num // 2  # 整除 2,更新商
    
    # 余数是倒序的,所以需要反转
    binary_result = ''.join(reversed(binary_digits))
    return binary_result

test_num = 42
result = decimal_to_binary(test_num)
print(f"十进制 {test_num} 转二进制(手动实现): {result}")

📌 这个方法虽然慢一点,但能帮你理解“为什么”二进制是这样来的。你可以试着在纸上模拟一下 42 ÷ 2 的过程,你会发现它和代码完全一致。


通用转换函数:支持任意进制

如果你不仅限于二进制、八进制、十六进制,还想支持其他进制(比如 3 进制、12 进制),Python 的 divmod()int() 函数可以帮你轻松实现。

def decimal_to_base(decimal_num, base):
    # 支持 2 到 36 进制
    if base < 2 or base > 36:
        raise ValueError("进制必须在 2 到 36 之间")
    
    if decimal_num == 0:
        return "0"
    
    digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    result = ""
    num = decimal_num
    
    while num > 0:
        remainder = num % base
        result = digits[remainder] + result  # 从高位开始拼接
        num = num // base
    
    return result

print(f"十进制 42 转 16 进制: {decimal_to_base(42, 16)}")

print(f"十进制 42 转 8 进制: {decimal_to_base(42, 8)}")

print(f"十进制 42 转 3 进制: {decimal_to_base(42, 3)}")

✅ 这个函数非常实用,尤其是当你处理自定义编码、密码学、或特殊数据格式时。它能帮你灵活应对各种进制需求。


实际应用案例:颜色值转换

在前端开发中,颜色常以十六进制表示,比如 #FF5733。这个值其实是 RGB(红、绿、蓝)三色的十六进制表示。我们可以用 Python 把 RGB 值转成十六进制颜色码。

def rgb_to_hex(red, green, blue):
    # 每个颜色分量必须在 0-255 之间
    if not (0 <= red <= 255 and 0 <= green <= 255 and 0 <= blue <= 255):
        raise ValueError("颜色值必须在 0-255 之间")
    
    # 使用 format() 方法格式化为两位十六进制数
    hex_red = format(red, '02X')
    hex_green = format(green, '02X')
    hex_blue = format(blue, '02X')
    
    return f"#{hex_red}{hex_green}{hex_blue}"

print(rgb_to_hex(255, 0, 0))

print(rgb_to_hex(128, 0, 128))

format(value, '02X') 的含义是:把 value 转为大写十六进制,不足两位时前面补 0。这个技巧在处理颜色、MAC 地址、哈希值等场景非常常见。


常见问题与注意事项

问题 说明
bin(0) 返回 0b0,如何去掉前缀? 使用 [2:] 切片即可,如 bin(0)[2:] 得到 '0'
为什么 hex(255) 返回 0xff Python 用 0x 表示十六进制,ff 是 255 的十六进制表示
能否将二进制字符串转回十进制? 可以,使用 int(binary_str, 2),如 int('1010', 2) 返回 10
为什么 oct(8) 返回 0o10 因为八进制中 8 不存在,10 是八进制的 8,即 1×8¹ + 0×8⁰

✅ 提示:int() 函数也可以反向转换,例如 int('1010', 2) 就是把二进制 1010 转成十进制 10。


总结与建议

今天,我们系统地学习了 Python 中十进制转二进制、八进制、十六进制的各种方法。从最简单的 bin()oct()hex(),到手动实现逻辑,再到通用进制转换函数,层层递进,帮助你真正掌握背后原理。

在实际开发中,你可能会遇到以下场景:

  • 处理网络协议中的十六进制数据包
  • 分析内存地址或调试程序时查看二进制
  • 前端开发中生成颜色代码
  • 数据加密或编码时需要自定义进制

掌握这些技能,不仅能提升编码效率,还能让你在面对底层问题时更有底气。

记住:理解比记忆更重要。即使你以后忘了某个函数怎么写,只要知道“除以进制取余”这个逻辑,就能自己推导出来。

希望这篇文章能成为你学习 Python 进制转换的实用指南。如果你觉得有帮助,欢迎转发给身边正在学习编程的朋友,一起进步!