pin_drop当前位置:知识文库 ❯ 图文

Python进制转换 - bin oct hex与int反转

一、进制转换函数简介

Python 提供了三个内置函数用于将十进制整数转换为其他进制字符串:bin()(二进制)、oct()(八进制)、hex()(十六进制)。配合 int() 函数,可以实现进制字符串到十进数的反向转换。

  • 二进制(Binary):基数为 2,仅使用 0 和 1,前缀为 0b

  • 八进制(Octal):基数为 8,使用 0-7,前缀为 0o

  • 十六进制(Hexadecimal):基数为 16,使用 0-9 和 a-f,前缀为 0x


二、语法与参数说明

基本语法

代码示例

bin(number)
oct(number)
hex(number)
int(string, base)

函数参数与返回值

函数 参数 返回值 前缀
bin() 整数 二进制字符串 0b
oct() 整数 八进制字符串 0o
hex() 整数 十六进制字符串 0x
int() 字符串 + 基数 十进制整数

三、bin() 函数使用示例

示例1:基础用法

代码示例

# 正整数转二进制
print(bin(10))   # 输出: 0b1010
print(bin(42))   # 输出: 0b101010

# 零
print(bin(0))    # 输出: 0b0

# 负整数
print(bin(-5))   # 输出: -0b101

示例2:去掉前缀

代码示例

# 方法1:使用切片去掉前缀
num = 42
binary = bin(num)[2:]
print(binary)  # 输出: 101010

# 方法2:使用 format()
print(format(42, 'b'))  # 输出: 101010

# 方法3:使用 f-string
print(f"{42:b}")        # 输出: 101010

示例3:位运算相关应用

代码示例

# 查看位运算结果
a = 12  # 0b1100
b = 10  # 0b1010

print(f"a AND b: {bin(a & b)}")   # 输出: 0b1000
print(f"a OR b:  {bin(a | b)}")   # 输出: 0b1110
print(f"a XOR b: {bin(a ^ b)}")   # 输出: 0b0110
print(f"~a:      {bin(~a)}")      # 输出: -0b1101

四、oct() 函数使用示例

示例1:基础用法

代码示例

# 正整数转八进制
print(oct(8))    # 输出: 0o10
print(oct(64))   # 输出: 0o100
print(oct(255))  # 输出: 0o377

# 零
print(oct(0))    # 输出: 0o0

# 负整数
print(oct(-10))  # 输出: -0o12

示例2:去掉前缀与其他写法

代码示例

# 使用 format()
print(format(64, 'o'))  # 输出: 100

# 使用 f-string
print(f"{255:o}")       # 输出: 377

# 使用切片
print(oct(64)[2:])      # 输出: 100

示例3:Linux 文件权限表示

代码示例

# Linux 文件权限常用八进制表示
permissions = {
    "rwxrwxrwx": 0o777,
    "rwxr-xr-x": 0o755,
    "rw-r--r--": 0o644,
    "rwx------": 0o700
}

for perm, octal in permissions.items():
    print(f"{perm}: {oct(octal)}")
# 输出:
# rwxrwxrwx: 0o777
# rwxr-xr-x: 0o755
# rw-r--r--: 0o644
# rwx------: 0o700

五、hex() 函数使用示例

示例1:基础用法

代码示例

# 正整数转十六进制
print(hex(10))   # 输出: 0xa
print(hex(255))  # 输出: 0xff
print(hex(4096)) # 输出: 0x1000

# 零
print(hex(0))    # 输出: 0x0

# 负整数
print(hex(-42))  # 输出: -0x2a

示例2:大写输出与格式化

代码示例

# 使用 format() 大写
print(format(255, 'X'))  # 输出: FF

# 使用 f-string 大写
print(f"{255:X}")        # 输出: FF

# 固定宽度填充
print(f"{255:04x}")      # 输出: 00ff
print(f"{255:08X}")      # 输出: 000000FF

示例3:颜色值表示

代码示例

# RGB 颜色值转十六进制
def rgb_to_hex(r, g, b):
    return f"#{r:02x}{g:02x}{b:02x}"

print(rgb_to_hex(255, 0, 0))    # 输出: #ff0000 (红色)
print(rgb_to_hex(0, 128, 255))  # 输出: #0080ff (蓝色)
print(rgb_to_hex(33, 150, 243)) # 输出: #2196f3 (Material Blue)

六、int() 反转进制字符串

示例1:基本反转

代码示例

# 二进制转十进制
print(int('0b1010', 2))   # 输出: 10
print(int('1010', 2))     # 输出: 10(无前缀也可以)

# 八进制转十进制
print(int('0o377', 8))    # 输出: 255
print(int('377', 8))      # 输出: 255

# 十六进制转十进制
print(int('0xff', 16))    # 输出: 255
print(int('ff', 16))      # 输出: 255

示例2:自动识别前缀

代码示例

# base=0 时自动识别前缀
print(int('0b1010', 0))  # 输出: 10
print(int('0o377', 0))   # 输出: 255
print(int('0xff', 0))    # 输出: 255

# 无前缀时必须指定 base
# int('1010', 0)  # ValueError: invalid literal for int() with base 0

示例3:完整进制转换循环

代码示例

# 十进制 -> 其他进制 -> 十进制
num = 255

# 二进制循环
bin_str = bin(num)
back_to_dec = int(bin_str, 2)
print(f"{num} -> {bin_str} -> {back_to_dec}")  # 输出: 255 -> 0b11111111 -> 255

# 八进制循环
oct_str = oct(num)
back_to_dec = int(oct_str, 8)
print(f"{num} -> {oct_str} -> {back_to_dec}")  # 输出: 255 -> 0o377 -> 255

# 十六进制循环
hex_str = hex(num)
back_to_dec = int(hex_str, 16)
print(f"{num} -> {hex_str} -> {back_to_dec}")  # 输出: 255 -> 0xff -> 255

七、三种进制函数对比

对比项 bin() oct() hex()
进制基数 2 8 16
使用字符 0, 1 0-7 0-9, a-f
前缀 0b 0o 0x
反转 base 2 8 16
常见用途 位运算、掩码 文件权限 颜色值、内存地址

同一数值的不同进制表示

代码示例

num = 255
print(f"十进制:   {num}")        # 输出: 255
print(f"二进制:   {bin(num)}")   # 输出: 0b11111111
print(f"八进制:   {oct(num)}")   # 输出: 0o377
print(f"十六进制: {hex(num)}")   # 输出: 0xff

八、实际应用场景

场景1:IP 地址处理

代码示例

# IP 地址转整数
def ip_to_int(ip):
    parts = ip.split('.')
    result = 0
    for part in parts:
        result = (result << 8) + int(part)
    return result

ip = "192.168.1.1"
ip_int = ip_to_int(ip)
print(f"IP: {ip}")
print(f"整数: {ip_int}")           # 输出: 3232235777
print(f"十六进制: {hex(ip_int)}")  # 输出: 0xc0a80101

场景2:位掩码操作

代码示例

# 使用十六进制定义位掩码
READ    = 0x01  # 0b0001
WRITE   = 0x02  # 0b0010
EXECUTE = 0x04  # 0b0100

# 设置权限
user_perms = READ | WRITE
print(f"用户权限: {bin(user_perms)}")  # 输出: 0b11

# 检查权限
has_read = bool(user_perms & READ)
has_execute = bool(user_perms & EXECUTE)
print(f"有读权限: {has_read}")      # 输出: True
print(f"有执行权限: {has_execute}")  # 输出: False

场景3:内存地址模拟

代码示例

# 模拟内存地址显示
base_address = 0x1000
offset = 0x3F

actual_address = base_address + offset
print(f"基地址: {hex(base_address)}")
print(f"偏移量: {hex(offset)}")
print(f"实际地址: {hex(actual_address)}")  # 输出: 0x103f
print(f"十进制地址: {actual_address}")     # 输出: 4159

九、注意事项

注意1:这三个函数只接受整数类型,传入浮点数会抛出 TypeError。如果需要转换浮点数,先使用 int() 取整。

代码示例

# 错误示例
bin(3.14)  # TypeError: 'float' object cannot be interpreted as an integer

# 正确做法
bin(int(3.14))  # 输出: 0b11

注意2:返回值包含前缀(0b/0o/0x),如果需要纯数字字符串,请使用切片 [2:]format()

代码示例

# 带前缀
print(bin(10))       # 输出: 0b1010

# 不带前缀
print(bin(10)[2:])   # 输出: 1010
print(format(10, 'b'))  # 输出: 1010

注意3:十六进制字母默认小写输出,如需大写请使用 format(num, 'X').upper()

代码示例

print(hex(255))           # 输出: 0xff
print(format(255, 'X'))   # 输出: FF
print(hex(255).upper())   # 输出: 0XFF

注意4int() 反转时,base 参数范围是 2-36。超出范围会抛出 ValueError

代码示例

# 错误示例
int('1010', 37)  # ValueError: int() base must be >= 2 and <= 36, or 0

十、小贴士

小贴士

format() 更灵活:除了 bin/oct/hex,format() 函数和 f-string 格式化也可以实现进制转换,且支持宽度填充、大小写控制等高级功能。常用格式符:b(二进制)、o(八进制)、x(十六进制小写)、X(十六进制大写)。


十一、常见问题

常见问题

Q1: 如何在代码中直接写不同进制的字面量?

Python 支持直接使用不同进制前缀:0b1010(二进制)、0o12(八进制)、0xff(十六进制)。它们都会被解析为十进制整数。

Q2: 负数的进制转换如何处理?

Python 的 bin/oct/hex 对负数会保留负号,如 bin(-5) 返回 -0b101。这与计算机内部的补码表示不同,仅用于显示。

Q3: 如何将二进制字符串转为十六进制?

可以先用 int(bin_str, 2) 转为十进制整数,再用 hex() 转为十六进制。例如:hex(int('11111111', 2)) 返回 0xff

Q4: format() 和 bin/oct/hex 哪个更好?

如果需要前缀,使用 bin/oct/hex 更直观;如果不需要前缀或需要格式化(如宽度填充、大写),使用 format() 或 f-string 更灵活。性能上差异很小,可根据场景选择。


十二、练习题

练习1

编写一个函数 show_all_bases(number),接收一个十进制整数,同时输出其二进制、八进制、十六进制表示,并验证通过 int() 反转后是否等于原值。

练习2

编写一个函数 hex_color_to_rgb(hex_color),将十六进制颜色字符串(如 #2196F3)转换为 RGB 元组 (33, 150, 243)

标签: 进制转换 bin函数 oct函数 hex函数 内置函数 二进制 十六进制

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python all()和any()函数 下一篇: Python bool()函数

poll相关推荐