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()返回的字符串都带有前缀(0b、0o、0x),这是 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 开始取到结尾。因为0b、0o、0x都是两个字符,所以从第 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 进制转换的实用指南。如果你觉得有帮助,欢迎转发给身边正在学习编程的朋友,一起进步!