Python 十进制转二进制、八进制、十六进制(超详细)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
- 《从零手撸:仿小红书(微服务架构)》 已完结,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
在编程和计算机科学领域,进制转换是一项基础且实用的技能。无论是理解计算机底层数据存储、解析网络协议,还是编写与硬件交互的代码,掌握十进制与二进制、八进制、十六进制之间的转换方法都至关重要。本文将从零开始,通过 Python 这一工具,系统讲解如何实现十进制到其他进制的转换。我们不仅会介绍内置函数的便捷用法,还会通过手动实现算法加深对原理的理解,并结合实际案例提升学习效果。
二进制、八进制、十六进制:基础概念与原理
1. 进制的本质
进制(Number System)是人类对数字进行计数和运算的规则。最常见的十进制(Decimal)以10为基数,每一位数字的权重是基数的幂次方。例如,数字 123
的十进制含义为:
[
1 \times 10^2 + 2 \times 10^1 + 3 \times 10^0 = 100 + 20 + 3 = 123
]
而二进制(Binary)、八进制(Octal)、十六进制(Hexadecimal)分别以 2、8、16 为基数。它们的每一位权重是基数的幂次方,但数字范围不同:
- 二进制:每位只能是
0
或1
; - 八进制:每位是
0-7
; - 十六进制:每位是
0-9
和A-F
(对应十进制的10-15
)。
比喻:可以将进制想象成不同语言的“翻译规则”。例如,十进制是“人类语言”,二进制是“计算机语言”,而八进制、十六进制则是“翻译中介”,帮助人类更高效地理解或记录二进制数据。
2. 十进制转其他进制的核心方法:除基取余法
十进制转其他进制的核心算法是 除基取余法。其步骤如下:
- 将十进制数 除以目标基数(如二进制基数为2);
- 记录 余数,余数即为当前位的数字;
- 用 商 继续重复上述步骤,直到商为0;
- 将余数 逆序排列,得到最终结果。
示例:十进制10转二进制
10 ÷ 2 = 5
,余数0
;5 ÷ 2 = 2
,余数1
;2 ÷ 2 = 1
,余数0
;1 ÷ 2 = 0
,余数1
;- 逆序余数:
1010
。
因此,十进制10的二进制表示为1010
。
八进制和十六进制的转换逻辑类似,仅基数不同。
Python 实现:内置函数与格式化方法
1. 直接调用内置函数
Python 提供了三个内置函数,可直接将十进制数转换为二进制、八进制、十六进制:
bin(number)
:返回二进制字符串(前缀0b
);oct(number)
:返回八进制字符串(前缀0o
);hex(number)
:返回十六进制字符串(前缀0x
)。
decimal_num = 10
binary = bin(decimal_num) # '0b1010'
octal = oct(decimal_num) # '0o12'
hexadecimal = hex(decimal_num) # '0xa'
print(f"十进制 {decimal_num} 的二进制表示:{binary}")
print(f"十进制 {decimal_num} 的八进制表示:{octal}")
print(f"十进制 {decimal_num} 的十六进制表示:{hexadecimal}")
注意事项:
- 结果包含前缀(如
0b
、0o
、0x
),若需去除前缀,可使用字符串切片:binary_str = bin(10)[2:] # '1010'
2. 使用 format()
函数与 f-string
Python 的格式化字符串功能提供了更灵活的转换方式:
-
format()
函数:binary = format(10, "b") # '1010' octal = format(10, "o") # '12' hexadecimal = format(10, "x") # 'a'
-
f-string(Python 3.6+):
print(f"二进制: {10:b}") # 二进制: 1010 print(f"八进制: {10:o}") # 八进制: 12 print(f"十六进制: {10:x}") # 十六进制: a
区别与选择:
bin()/oct()/hex()
返回带前缀的字符串,适合需要标识进制类型时使用;format()
和 f-string 适合直接获取纯数值字符串,且可通过格式参数控制大小写(如X
表示大写十六进制)。
手动实现:从原理到代码
1. 二进制转换算法
通过循环实现除基取余法:
def decimal_to_binary(n):
binary = ""
while n > 0:
remainder = n % 2
binary = str(remainder) + binary # 将余数逆序拼接
n = n // 2
return binary
print(decimal_to_binary(10)) # 输出:1010
关键点解释:
remainder = n % 2
:计算余数;binary = str(remainder) + binary
:将余数添加到字符串的前面,保证逆序;- 循环终止条件为
n == 0
。
2. 八进制与十六进制的扩展
只需修改基数即可复用上述逻辑:
八进制实现:
def decimal_to_octal(n):
octal = ""
while n > 0:
remainder = n % 8
octal = str(remainder) + octal
n = n // 8
return octal
print(decimal_to_octal(10)) # 输出:12
十六进制实现:
def decimal_to_hex(n):
hex_digits = "0123456789ABCDEF"
hexadecimal = ""
while n > 0:
remainder = n % 16
hexadecimal = hex_digits[remainder] + hexadecimal
n = n // 16
return hexadecimal
print(decimal_to_hex(10)) # 输出:A
注意:
- 十六进制中,余数超过9时需用字母表示,因此需要预定义
hex_digits
数组。
实际应用场景与案例
1. 文件权限的八进制表示
在 Unix/Linux 系统中,文件权限常用八进制数字表示。例如,权限 755
对应二进制 111 101 101
,分别表示所有者、组和其他用户的权限。
def permission_to_octal(permissions):
# 假设 permissions 是二进制字符串,如 "111101101"
decimal = int(permissions, 2)
return oct(decimal)[2:] # 去除前缀 0o
print(permission_to_octal("111101101")) # 输出:755
2. 颜色代码的十六进制转换
网页设计中,颜色常以十六进制表示(如 #FF0000
表示红色)。
def rgb_to_hex(r, g, b):
# 将 RGB 值(0-255)转换为十六进制字符串
return f"#{r:02x}{g:02x}{b:02x}"
print(rgb_to_hex(255, 0, 0)) # 输出:#ff0000
3. 处理负数与前导零
Python 的内置函数会自动处理负数(如 bin(-10)
返回 -0b1010
),但手动实现需额外考虑符号位。前导零可通过格式化填充:
def binary_with_padding(n, length=8):
binary = bin(n)[2:]
return binary.zfill(length) # 补足到指定长度
print(binary_with_padding(10, 8)) # 输出:00001010
常见问题与解决方案
1. 如何去除前缀?
使用字符串切片:
hex_value = hex(255)[2:] # 'ff'
2. 如何将其他进制转换回十进制?
Python 的 int()
函数支持指定基数:
binary_str = "1010"
decimal = int(binary_str, 2) # 10
hex_str = "a"
decimal = int(hex_str, 16) # 10
3. 处理大数时性能优化
对于非常大的数字,建议优先使用内置函数,因其经过高度优化。手动实现适用于理解原理或特定需求。
结论
通过本文,我们系统学习了 Python 十进制转二进制、八进制、十六进制 的多种方法,包括内置函数、格式化字符串和手动实现的算法。这些技能不仅是编程的基础,也是理解计算机底层逻辑的关键。无论是处理文件权限、颜色代码,还是解析二进制数据,掌握进制转换都能显著提升问题解决能力。
建议读者通过以下步骤巩固知识:
- 使用
bin()
,oct()
,hex()
完成简单转换; - 尝试手动实现算法并调试;
- 结合实际场景(如网络编程、数据解析)应用所学内容。
进制转换如同一把“翻译钥匙”,帮助开发者在不同数字语言之间自由穿梭。希望本文能成为你探索编程世界的坚实起点!