Python 可以将数字和字符串处理为二进制、八进制和十六进制的数字,以及通常的十进制数字。在它们之间进行转换也很容易。
在本节中,将对以下内容进行解释,并附有示例代码。
- 用二进制、八进制和十六进制写整数。
- 将数字转换成二进制、八进制和十六进制符号的字符串。
- 内置函数
bin()
,oct()
,hex()
- 字串方法
str.format()
, 内置功能format()
,f字符串 - 将一个负整数转换为二补格式的字符串。
- 内置函数
- 将二进制、八进制和十六进制符号的字符串转换为数字。
- 内置函数
int()
- 内置函数
- 应用实例
- 二进制字符串运算
- 二进制、八进制和十六进制数字之间的转换
用二进制、八进制和十六进制写整数。
通过添加以下前缀,整数int的数字可以分别用二进制、八进制和十六进制书写。
你也可以使用大写字母。
- 二进制数。
0b
或0B
- 八进制。
0o
或0O
- 十六进制数字。
0x
或0X
print()的输出将是十进制的符号。
bin_num = 0b10
oct_num = 0o10
hex_num = 0x10
print(bin_num)
print(oct_num)
print(hex_num)
# 2
# 8
# 16
Bin_num = 0B10
Oct_num = 0O10
Hex_num = 0X10
print(Bin_num)
print(Oct_num)
print(Hex_num)
# 2
# 8
# 16
即使有前缀,该类型也是一个整数int。
print(type(bin_num))
print(type(oct_num))
print(type(hex_num))
# <class 'int'>
# <class 'int'>
# <class 'int'>
print(type(Bin_num))
print(type(Oct_num))
print(type(Hex_num))
# <class 'int'>
# <class 'int'>
# <class 'int'>
由于它是一个整数类型,它可以用于常规的算术运算。
result = 0b10 * 0o10 + 0x10
print(result)
# 32
从 Python 3.6 开始,可以在数字中插入下划线 _。重复下划线_将导致一个错误,但是只要不重复,你可以任意插入。
下划线_不影响数字,所以当有很多数字时,它可以作为分隔符使用。例如,每隔四位数字插入一个下划线_,就很容易阅读。
print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True
bin_num = 0b1111_1111_1111
print(bin_num)
# 4095
将数字转换成二进制、八进制和十六进制符号的字符串。
要将一个数字转换成二进制、八进制或十六进制符号的字符串,请使用以下内置函数。
- 内置函数
bin()
,oct()
,hex()
- 字串方法
str.format()
, 内置功能format()
,f字符串
本节还解释了如何获得一个以二补格式表示的负值的字符串。
内置函数bin(), oct(), hex()。
以下内置函数可以将数字转换成二进制、八进制和十六进制字符串。
- 二进制数。
bin()
- 八进制。
oct()
- 十六进制数字。
hex()
每个人都返回一个带有以下前缀的字符串
- 二进制数。
0b
- 八进制。
0o
- 十六进制数字。
0x
- bin() — Built-in Functions — Python 3.10.0 Documentation
- oct() — Built-in Functions — Python 3.10.0 Documentation
- hex() — Built-in Functions — Python 3.10.0 Documentation
i = 255
print(bin(i))
print(oct(i))
print(hex(i))
# 0b11111111
# 0o377
# 0xff
print(type(bin(i)))
print(type(oct(i)))
print(type(hex(i)))
# <class 'str'>
# <class 'str'>
# <class 'str'>
如果你不需要前缀,可以使用slice[2:]来提取后面的字符串,或者使用format(),接下来会解释。
print(bin(i)[2:])
print(oct(i)[2:])
print(hex(i)[2:])
# 11111111
# 377
# ff
如果你想把它转换成十进制的字符串,你可以使用str()。
print(str(i))
# 255
print(type(str(i)))
# <class 'str'>
内置函数format(),字符串方法str.format(),f字符串
内置函数format()和字符串方法str.format()和f-string也可以将数字转换成二进制、八进制和十六进制的字符串。
通过指定format()的第二个参数如下,可以分别转换为二进制、八进制和十六进制的字符串。
- 二进制数。
b
- 八进制。
o
- 十六进制数字。
x
print(format(i, 'b'))
print(format(i, 'o'))
print(format(i, 'x'))
# 11111111
# 377
# ff
print(type(format(i, 'b')))
print(type(format(i, 'o')))
print(type(format(i, 'x')))
# <class 'str'>
# <class 'str'>
# <class 'str'>
如果你想得到一个前缀为0b,0o,0x的字符串,请在格式化规范字符串中添加#。
print(format(i, '#b'))
print(format(i, '#o'))
print(format(i, '#x'))
# 0b11111111
# 0o377
# 0xff
也可以用任何数字来填写0。注意,在用前缀填写0时,还必须考虑到前缀的字符数(两个字符)。
print(format(i, '08b'))
print(format(i, '08o'))
print(format(i, '08x'))
# 11111111
# 00000377
# 000000ff
print(format(i, '#010b'))
print(format(i, '#010o'))
print(format(i, '#010x'))
# 0b11111111
# 0o00000377
# 0x000000ff
字符串方法str.format()也可用于转换。
print('{:08b}'.format(i))
print('{:08o}'.format(i))
print('{:08x}'.format(i))
# 11111111
# 00000377
# 000000ff
从Python 3.6开始,你也可以使用f字符串。f'xxx'
print(f'{i:08b}')
print(f'{i:08o}')
print(f'{i:08x}')
# 11111111
# 00000377
# 000000ff
将一个负整数转换为二补格式的字符串。
当一个负整数用bin()或format()转换为二进制或十六进制字符串时,绝对值会有一个减号。
x = -9
print(x)
print(bin(x))
# -9
# -0b1001
在Python中,对负整数的位操作也是以二的补数形式进行的。因此,如果你想得到一个以二的补数形式表示的字符串,你可以用所需的最大位数进行位数逻辑OR&,如下所示。
- 4bit:
0b1111(=0xf)
- 8bit:
0xff
- 16bit:
0xffff
print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7
将二进制、八进制和十六进制符号的字符串转换为数字。
内置函数int()
要将二进制、八进制或十六进制的字符串转换成数字,请使用内置函数int()。
使用int(string, radix),一个二进制、八进制、十六进制等的字符串str可以根据小数点转换为数字int。如果省略了小数点,数字就被认为是十进制。
print(int('10'))
print(int('10', 2))
print(int('10', 8))
print(int('10', 16))
# 10
# 2
# 8
# 16
print(type(int('10')))
print(type(int('10', 2)))
print(type(int('10', 8)))
print(type(int('10', 16)))
# <class 'int'>
# <class 'int'>
# <class 'int'>
# <class 'int'>
如果弧度设置为0,则根据以下字符串前缀进行转换。
- 二进制前缀。
0b
或0B
- 八进制前缀。
0o
或0O
- 十六进制的前缀。
0x
或0X
print(int('0b10', 0))
print(int('0o10', 0))
print(int('0x10', 0))
# 2
# 8
# 16
print(int('0B10', 0))
print(int('0O10', 0))
print(int('0X10', 0))
# 2
# 8
# 16
如果基数是0并且没有前缀,它将被转换为十进制数,但要注意,如果开头(左边)填的是0,将发生错误。
print(int('10', 0))
# 10
# print(int('010', 0))
# ValueError: invalid literal for int() with base 0: '010'
在其他情况下,零填充的字符串可以原样转换。
print(int('010'))
# 10
print(int('00ff', 16))
print(int('0x00ff', 0))
# 255
# 255
如果字符串不能用指定的弧度或前缀进行转换,就会发生错误。
# print(int('ff', 2))
# ValueError: invalid literal for int() with base 2: 'ff'
# print(int('0a10', 0))
# ValueError: invalid literal for int() with base 0: '0a10'
# print(int('0bff', 0))
# ValueError: invalid literal for int() with base 0: '0bff'
应用实例
二进制字符串运算
例如,要对一个前缀为0b的二进制符号的字符串进行操作。
你可以很容易地将其转换为数字值(整数类型int),对其进行操作,然后再次将其转换为字符串str。
a = '0b1001'
b = '0b0011'
c = int(a, 0) + int(b, 0)
print(c)
print(bin(c))
# 12
# 0b1100
二进制、八进制和十六进制数字之间的转换
将二进制、八进制和十六进制的字符串相互转换也很容易。一旦转换为数字int,就可以转换为任何格式的字符串。
零填充、前缀等可由格式化规范字符串控制。
a_0b = '0b1110001010011'
print(format(int(a, 0), '#010x'))
# 0x00000009
print(format(int(a, 0), '#010o'))
# 0o00000011