Python potrafi operować na liczbach i łańcuchach w postaci binarnej, ósemkowej i szesnastkowej, jak również na zwykłych liczbach dziesiętnych. Łatwo jest również konwertować między nimi.
W tym rozdziale zostaną wyjaśnione następujące treści wraz z przykładowym kodem.
- Zapisywać liczby całkowite w systemie dwójkowym, ósemkowym i szesnastkowym.
- Konwersja liczb na ciągi znaków w notacji binarnej, ósemkowej i szesnastkowej.
- funkcja wbudowana (np. w języku programowania)
bin()
,oct()
,hex()
- metoda łańcuchowa
str.format()
, Wbudowane funkcjeformat()
, f string - Konwertuje ujemną liczbę całkowitą na łańcuch w formacie dopełnienia dwójkowego.
- funkcja wbudowana (np. w języku programowania)
- Konwertuje ciągi znaków w notacji binarnej, ósemkowej i szesnastkowej na liczby.
- funkcja wbudowana (np. w języku programowania)
int()
- funkcja wbudowana (np. w języku programowania)
- Przykłady zastosowań
- Arytmetyka ciągów binarnych
- Konwersja między liczbami binarnymi, ósemkowymi i szesnastkowymi
Zapisywać liczby całkowite w systemie dwójkowym, ósemkowym i szesnastkowym.
Dodając następujące przedrostki, liczby całkowite int można zapisywać odpowiednio w systemie dwójkowym, ósemkowym i szesnastkowym.
Można również używać wielkich liter.
- Liczba binarna:
0b
lub0B
- Oktal:
0o
lub0O
- Liczba szesnastkowa:
0x
lub0X
Wynik działania funkcji print() będzie w notacji dziesiętnej.
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
Nawet z przedrostkiem, typ jest liczbą całkowitą 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'>
Ponieważ jest to typ całkowity, może być używany do zwykłych operacji arytmetycznych.
result = 0b10 * 0o10 + 0x10
print(result)
# 32
Począwszy od Pythona 3.6, możliwe jest wstawianie podkreślników _ w liczbach. Powtórzenie podkreślenia _ spowoduje błąd, ale możesz wstawić dowolną ilość podkreśleń, o ile nie będziesz ich powtarzać.
Podkreślenie _ nie ma wpływu na liczbę, więc może być używane jako separator, gdy jest wiele cyfr. Na przykład, wstawienie podkreślenia _ co cztery cyfry jest łatwe do odczytania.
print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True
bin_num = 0b1111_1111_1111
print(bin_num)
# 4095
Konwersja liczb na ciągi znaków w notacji binarnej, ósemkowej i szesnastkowej.
Aby przekonwertować liczbę na łańcuch w notacji binarnej, ósemkowej lub szesnastkowej, użyj następujących wbudowanych funkcji.
- funkcja wbudowana (np. w języku programowania)
bin()
,oct()
,hex()
- metoda łańcuchowa
str.format()
, Wbudowane funkcjeformat()
, f string
Ta sekcja wyjaśnia również, jak uzyskać łańcuch wyrażony w formacie dopełnienia dwójkowego dla wartości ujemnych.
Wbudowane funkcje bin(), oct(), hex()
Następujące wbudowane funkcje mogą konwertować liczby na łańcuchy binarne, ósemkowe i szesnastkowe.
- Liczba binarna:
bin()
- Oktal:
oct()
- Liczba szesnastkowa:
hex()
Każda z nich zwraca łańcuch znaków z następującymi prefiksami
- Liczba binarna:
0b
- Oktal:
0o
- Liczba szesnastkowa:
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'>
Jeśli nie potrzebujesz prefiksu, użyj slice[2:] aby wyodrębnić łańcuch znajdujący się za nim, lub użyj format() jak wyjaśniono dalej.
print(bin(i)[2:])
print(oct(i)[2:])
print(hex(i)[2:])
# 11111111
# 377
# ff
Jeśli chcesz przekonwertować go na ciąg dziesiętny, możesz użyć funkcji str().
print(str(i))
# 255
print(type(str(i)))
# <class 'str'>
Wbudowana funkcja format(), string metoda str.format(), f string
Wbudowana funkcja format() oraz metody łańcuchowe str.format() i f-string mogą również konwertować liczby na łańcuchy binarne, ósemkowe i szesnastkowe.
Poprzez określenie drugiego argumentu funkcji format() w następujący sposób, może on zostać przekonwertowany odpowiednio na łańcuch binarny, ósemkowy i szesnastkowy.
- Liczba binarna:
b
- Oktal:
o
- Liczba szesnastkowa:
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'>
Jeśli chcesz otrzymać łańcuch z przedrostkiem 0b,0o,0x, dodaj # do łańcucha specyfikacji formatowania.
print(format(i, '#b'))
print(format(i, '#o'))
print(format(i, '#x'))
# 0b11111111
# 0o377
# 0xff
Możliwe jest również wpisanie 0 z dowolną liczbą cyfr. Należy pamiętać, że przy wpisywaniu zera z prefiksem należy również uwzględnić liczbę znaków dla prefiksu (dwa znaki).
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
Do konwersji może być również użyta metoda łańcuchowa str.format().
print('{:08b}'.format(i))
print('{:08o}'.format(i))
print('{:08x}'.format(i))
# 11111111
# 00000377
# 000000ff
Począwszy od Pythona 3.6, można również używać łańcucha f.f'xxx'
print(f'{i:08b}')
print(f'{i:08o}')
print(f'{i:08x}')
# 11111111
# 00000377
# 000000ff
Konwertuje ujemną liczbę całkowitą na łańcuch w formacie dopełnienia dwójkowego.
Gdy ujemna liczba całkowita zostanie przekonwertowana na łańcuch binarny lub szesnastkowy przy użyciu bin() lub format(), wartość bezwzględna będzie miała znak minus.
x = -9
print(x)
print(bin(x))
# -9
# -0b1001
W Pythonie operacje bitowe na liczbach całkowitych ujemnych są również wykonywane w reprezentacji dopełnienia dwójkowego. Dlatego też, jeśli chcesz uzyskać ciąg wyrażony w postaci dwójkowego dopełnienia, możesz wykonać bitowe logiczne OR& z maksymalną wymaganą liczbą cyfr bitowych, jak poniżej.
- 4bit:
0b1111(=0xf)
- 8bit:
0xff
- 16bit:
0xffff
print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7
Konwertuje ciągi znaków w notacji binarnej, ósemkowej i szesnastkowej na liczby.
Wbudowana funkcja int()
Aby przekonwertować łańcuch znaków w notacji binarnej, ósemkowej lub szesnastkowej na liczbę, użyj wbudowanej funkcji int().
Za pomocą int(łańcuch, radix), łańcuch str w notacji binarnej, ósemkowej, szesnastkowej, itp. może zostać przekonwertowany na liczbę int w oparciu o radix. Jeśli radix jest pominięty, to liczba jest traktowana jako dziesiętna.
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'>
Jeżeli radix jest ustawiony na 0, to konwersja jest wykonywana na podstawie następującego prefiksu łańcucha.
- Prefiks binarny:
0b
lub0B
- Prefiks oktalny:
0o
lub0O
- Prefiks szesnastkowy:
0x
lub0X
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
Jeśli liczba bazowa jest równa 0 i nie ma przedrostka, zostanie przekonwertowana jako liczba dziesiętna, ale należy pamiętać, że jeśli początek (lewa strona) jest wypełniony 0, wystąpi błąd.
print(int('10', 0))
# 10
# print(int('010', 0))
# ValueError: invalid literal for int() with base 0: '010'
W innych przypadkach, łańcuchy wypełnione zerem mogą być konwertowane tak jak jest.
print(int('010'))
# 10
print(int('00ff', 16))
print(int('0x00ff', 0))
# 255
# 255
Jeżeli łańcucha nie można skonwertować z określonym radixem lub prefiksem, to dochodzi do błędu.
# 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'
Przykłady zastosowań
Arytmetyka ciągów binarnych
Na przykład, aby wykonać operację na łańcuchu w notacji binarnej z prefiksem 0b.
Możesz łatwo przekonwertować go na wartość numeryczną (typ integer int), wykonać na nim operacje, a następnie ponownie przekonwertować go na łańcuch str.
a = '0b1001'
b = '0b0011'
c = int(a, 0) + int(b, 0)
print(c)
print(bin(c))
# 12
# 0b1100
Konwersja między liczbami binarnymi, ósemkowymi i szesnastkowymi
Łatwo jest również konwertować ciągi binarne, ósemkowe i szesnastkowe na siebie. Po przekonwertowaniu na liczbę całkowitą, można ją przekonwertować na ciąg znaków w dowolnym formacie.
Wypełnianie zera, prefiksowanie itd. może być kontrolowane przez łańcuch specyfikacji formatowania.
a_0b = '0b1110001010011'
print(format(int(a, 0), '#010x'))
# 0x00000009
print(format(int(a, 0), '#010o'))
# 0o00000011