Python 可以將數字和字符串處理為二進制、八進制和十六進制數以及通常的十進制數。它們之間的轉換也很容易。
本節將結合示例代碼對以下內容進行說明。
- 以二進制、八進制和十六進制寫入整數。
- 將數字轉換為二進制、八進制和十六進製表示法的字符串。
- 內置函數(例如在編程語言中)
bin()
,oct()
,hex()
- 字符串方法
str.format()
, 內置函數format()
, f 字符串 - 將負整數轉換為二進制補碼格式的字符串。
- 內置函數(例如在編程語言中)
- 將二進制、八進制和十六進製表示法的字符串轉換為數字。
- 內置函數(例如在編程語言中)
int()
- 內置函數(例如在編程語言中)
- 應用實例
- 二進製字符串算術
- 在二進制、八進制和十六進制數之間轉換
以二進制、八進制和十六進制寫入整數。
通過添加以下前綴,integer 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。請注意,在用前綴填充零時,還必須考慮前綴的字符數(兩個字符)。
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