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)分别以 2816 为基数。它们的每一位权重是基数的幂次方,但数字范围不同:

  • 二进制:每位只能是 01
  • 八进制:每位是 0-7
  • 十六进制:每位是 0-9A-F(对应十进制的 10-15)。

比喻:可以将进制想象成不同语言的“翻译规则”。例如,十进制是“人类语言”,二进制是“计算机语言”,而八进制、十六进制则是“翻译中介”,帮助人类更高效地理解或记录二进制数据。


2. 十进制转其他进制的核心方法:除基取余法

十进制转其他进制的核心算法是 除基取余法。其步骤如下:

  1. 将十进制数 除以目标基数(如二进制基数为2);
  2. 记录 余数,余数即为当前位的数字;
  3. 继续重复上述步骤,直到商为0;
  4. 将余数 逆序排列,得到最终结果。

示例:十进制10转二进制

  1. 10 ÷ 2 = 5,余数 0
  2. 5 ÷ 2 = 2,余数 1
  3. 2 ÷ 2 = 1,余数 0
  4. 1 ÷ 2 = 0,余数 1
  5. 逆序余数: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}")  

注意事项:

  • 结果包含前缀(如 0b0o0x),若需去除前缀,可使用字符串切片:
    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 十进制转二进制、八进制、十六进制 的多种方法,包括内置函数、格式化字符串和手动实现的算法。这些技能不仅是编程的基础,也是理解计算机底层逻辑的关键。无论是处理文件权限、颜色代码,还是解析二进制数据,掌握进制转换都能显著提升问题解决能力。

建议读者通过以下步骤巩固知识:

  1. 使用 bin(), oct(), hex() 完成简单转换;
  2. 尝试手动实现算法并调试;
  3. 结合实际场景(如网络编程、数据解析)应用所学内容。

进制转换如同一把“翻译钥匙”,帮助开发者在不同数字语言之间自由穿梭。希望本文能成为你探索编程世界的坚实起点!

最新发布