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() 函数使用示例
示例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七、三种进制函数对比
同一数值的不同进制表示
代码示例
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注意4:
int()反转时,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)。
本文涉及AI创作
内容由AI创作,请仔细甄别