Python进阶编程:编写更高效、优雅的Python代码
上QQ阅读APP看书,第一时间看更新

1.3 进制转换

在实际应用中,通常会因为一些特殊需求,需要转换或者输出使用二进制、八进制或十六进制表示的整数,如为防止某些数字以明文的形式出现。

为了将整数转换为二进制、八进制或十六进制的文本串,我们可以分别使用bin()、oct()或hex()函数,相关代码(binary_exp.py)如下:


x = 1234
print(f'binary of {x} is: {bin(x)}')
print(f'octal of {x} is: {oct(x)}')
print(f'hexadecimal of {x} is: {hex(x)}')

执行py文件,输出结果如下:


binary of 1234 is: 0b10011010010
octal of 1234 is: 0o2322
hexadecimal of 1234 is: 0x4d2

如果不想输出0b、0o或者0x前缀,可以执行如下操作(binary_exp.py):


print(f'binary not show 0b: {x: b}')
print(f'octal not show 0o: {x: o}')
print(f'hexadecimal not show 0x: {x: x}')

执行py文件,输出结果如下:


binary not show 0b:  10011010010
octal not show 0o:  2322
hexadecimal not show 0x:  4d2

整数是有符号的,如果处理的是负数,输出结果会包含一个负号,示例(binary_exp.py)如下:


x = -1234
print(f'binary of {x} is: {x: b}')
print(f'hexadecimal of {x} is: {x: x}')

执行py文件,输出结果如下:


binary of -1234 is: -10011010010
hexadecimal of -1234 is: -4d2

如果想得到一个无符号值,需要增加一个指示最大位长度的值。如为了显示32位的值,可以执行如下操作(binary_exp.py):


print(f'(2**32 + x) binary result:{2**32 + x: b}')
print(f'(2**32 + x) hexadecimal result: {2**32 + x:x}')

执行py文件,输出结果如下:


(2**32 + x) binary result: 11111111111111111111101100101110
(2**32 + x) hexadecimal result: fffffb2e

为了以不同的进制转换整数字符串,可以使用带有进制的int()函数,相关代码(binary_exp.py)如下:


print(int('4d2', 16))
print(int('10011010010', 2))

执行py文件,输出结果如下:


1234
1234

大多数情况下处理二进制、八进制和十六进制整数是很简单的,只要记住,这些转换属于整数和其对应的文本表示之间的转换即可。

使用八进制时需要注意,Python中八进制数的语法与其他进制的语法稍有不同。如像下面这样使用八进制会出现错误:


import os
os.chmod('test.py', 0755)

我们需确保八进制数的前缀是0o,示例如下:


os.chmod('test.py', 0o755)