Python može da obrađuje brojeve i nizove kao binarne, oktalne i heksadecimalne brojeve, kao i uobičajene decimalne brojeve. Takođe je lako konvertovati između njih.
U ovom odeljku, sledeći sadržaj će biti objašnjen zajedno sa primerom koda.
- Napišite cele brojeve u binarnom, oktalnom i heksadecimalnom obliku.
- Pretvorite brojeve u nizove u binarnom, oktalnom i heksadecimalnom zapisu.
- ugrađena funkcija (npr. u programskom jeziku)
bin()
,oct()
,hex()
- string metoda
str.format()
, Ugrađene funkcijeformat()
, f string - Pretvorite negativan ceo broj u string u komplementarnom formatu dva.
- ugrađena funkcija (npr. u programskom jeziku)
- Pretvorite nizove u binarnom, oktalnom i heksadecimalnom zapisu u brojeve.
- ugrađena funkcija (npr. u programskom jeziku)
int()
- ugrađena funkcija (npr. u programskom jeziku)
- Primeri primene
- Aritmetika binarnog niza
- Konvertujte između binarnih, oktalnih i heksadecimalnih brojeva
Napišite cele brojeve u binarnom, oktalnom i heksadecimalnom obliku.
Dodavanjem sledećih prefiksa, celobrojni int brojevi se mogu napisati u binarnom, oktalnom i heksadecimalnom obliku.
Možete koristiti i velika slova.
- binarni broj:
0b
ili0B
- oktalno:
0o
ili0O
- Heksadecimalni broj:
0x
ili0X
Izlaz print() će biti u decimalnom zapisu.
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
Čak i sa prefiksom, tip je ceo broj 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'>
Pošto je celobrojni tip, može se koristiti za redovne aritmetičke operacije.
result = 0b10 * 0o10 + 0x10
print(result)
# 32
Počevši od Python-a 3.6, moguće je ubaciti donje crte _ u brojeve. Ponavljanje donje crte _ će dovesti do greške, ali možete umetnuti koliko god želite sve dok je ne ponavljate.
Donja crta _ ne utiče na broj, tako da se može koristiti kao separator kada ima mnogo cifara. Na primer, umetanje donje crte _ na svake četiri cifre je lako za čitanje.
print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True
bin_num = 0b1111_1111_1111
print(bin_num)
# 4095
Pretvorite brojeve u nizove u binarnom, oktalnom i heksadecimalnom zapisu.
Da biste broj pretvorili u string u binarnom, oktalnom ili heksadecimalnom zapisu, koristite sledeće ugrađene funkcije.
- ugrađena funkcija (npr. u programskom jeziku)
bin()
,oct()
,hex()
- string metoda
str.format()
, Ugrađene funkcijeformat()
, f string
Ovaj odeljak takođe objašnjava kako da dobijete string izražen u komplementarnom formatu dva za negativne vrednosti.
Ugrađene funkcije bin(), oct(), hex()
Sledeće ugrađene funkcije mogu da konvertuju brojeve u binarne, oktalne i heksadecimalne nizove.
- binarni broj:
bin()
- oktalno:
oct()
- Heksadecimalni broj:
hex()
Svaki vraća string sa sledećim prefiksima
- binarni broj:
0b
- oktalno:
0o
- Heksadecimalni broj:
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'>
Ako vam ne treba prefiks, koristite slice[2:] da izdvojite string iza njega ili koristite format() kao što je objašnjeno u nastavku.
print(bin(i)[2:])
print(oct(i)[2:])
print(hex(i)[2:])
# 11111111
# 377
# ff
Ako želite da ga konvertujete u decimalni string, možete koristiti str().
print(str(i))
# 255
print(type(str(i)))
# <class 'str'>
Ugrađena funkcija format(), string metod str.format(), f string
Ugrađena funkcija format() i metode stringova str.format() i f-string takođe mogu da konvertuju brojeve u binarne, oktalne i heksadecimalne nizove.
Navođenjem drugog argumenta formata() na sledeći način, on se može konvertovati u binarne, oktalne i heksadecimalne stringove, respektivno.
- binarni broj:
b
- oktalno:
o
- Heksadecimalni broj:
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'>
Ako želite da dobijete string sa prefiksom 0b,0o,0x, dodajte # stringu specifikacije formatiranja.
print(format(i, '#b'))
print(format(i, '#o'))
print(format(i, '#x'))
# 0b11111111
# 0o377
# 0xff
Takođe je moguće popuniti 0 bilo kojim brojem cifara. Imajte na umu da se broj znakova za prefiks (dva znaka) takođe mora uzeti u obzir prilikom popunjavanja nule prefiksom.
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
Metod stringa str.format() se takođe može koristiti za konverziju.
print('{:08b}'.format(i))
print('{:08o}'.format(i))
print('{:08x}'.format(i))
# 11111111
# 00000377
# 000000ff
Počevši od Python-a 3.6, takođe možete koristiti f string.f'xxx'
print(f'{i:08b}')
print(f'{i:08o}')
print(f'{i:08x}')
# 11111111
# 00000377
# 000000ff
Pretvorite negativan ceo broj u string u komplementarnom formatu dva.
Kada se negativan ceo broj konvertuje u binarni ili heksadecimalni niz pomoću bin() ili format(), apsolutna vrednost će imati predznak minus.
x = -9
print(x)
print(bin(x))
# -9
# -0b1001
U Python-u, bitne operacije nad negativnim celim brojevima se takođe izvode u komplementarnoj predstavi dva. Stoga, ako želite da dobijete string izražen u obliku komplementa dva, možete da uzmete logičko OR& sa maksimalnim brojem potrebnih cifara bita, kao što sledi.
- 4bit:
0b1111(=0xf)
- 8bit:
0xff
- 16bit:
0xffff
print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7
Pretvorite nizove u binarnom, oktalnom i heksadecimalnom zapisu u brojeve.
Ugrađena funkcija int()
Da biste string u binarnom, oktalnom ili heksadecimalnom zapisu pretvorili u broj, koristite ugrađenu funkciju int().
Sa int(string, radix), string str u binarnom, oktalnom, heksadecimalnom zapisu, itd. može se konvertovati u numerički int na osnovu osnova. Ako je osnova izostavljena, broj se smatra decimalnim.
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'>
Ako je osnova postavljena na 0, konverzija se vrši na osnovu sledećeg prefiksa stringa.
- Binarni prefiks:
0b
ili0B
- Oktalni prefiks:
0o
ili0O
- Heksadecimalni prefiks:
0x
ili0X
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
Ako je osnovni broj 0 i nema prefiksa, biće konvertovan kao decimalni broj, ali imajte na umu da ako je početak (leva strana) popunjen sa 0, doći će do greške.
print(int('10', 0))
# 10
# print(int('010', 0))
# ValueError: invalid literal for int() with base 0: '010'
U drugim slučajevima, stringovi ispunjeni nulom mogu se konvertovati kao što jesu.
print(int('010'))
# 10
print(int('00ff', 16))
print(int('0x00ff', 0))
# 255
# 255
Ako se string ne može konvertovati sa navedenim osnovama ili prefiksom, dolazi do greške.
# 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'
Primeri primene
Aritmetika binarnog niza
Na primer, da izvršite operaciju nad nizom u binarnoj notaciji sa prefiksom 0b.
Možete je lako pretvoriti u numeričku vrednost (celobrojni tip int), izvršiti operacije nad njom, a zatim je ponovo pretvoriti u string string.
a = '0b1001'
b = '0b0011'
c = int(a, 0) + int(b, 0)
print(c)
print(bin(c))
# 12
# 0b1100
Konvertujte između binarnih, oktalnih i heksadecimalnih brojeva
Takođe je lako konvertovati binarne, oktalne i heksadecimalne nizove jedan u drugi. Jednom konvertovan u numerički int, može se konvertovati u niz bilo kog formata.
Popunjavanje nule, prefiksiranje itd. može se kontrolisati nizom specifikacije formatiranja.
a_0b = '0b1110001010011'
print(format(int(a, 0), '#010x'))
# 0x00000009
print(format(int(a, 0), '#010o'))
# 0o00000011