Prevod binárnych, oktálových a hexadecimálnych čísel a reťazcov z a do jazyka Python

obchodné

Python dokáže pracovať s číslami a reťazcami ako s binárnymi, osmičkovými a šestnástkovými číslami, ako aj s bežnými desiatkovými číslami. Medzi nimi sa dá aj ľahko konvertovať.

V tejto časti bude vysvetlený nasledujúci obsah spolu so vzorovým kódom.

  • Zápis celých čísel v dvojkovej, osmičkovej a šestnástkovej sústave.
  • Prevod čísel na reťazce v binárnom, oktálnom a hexadecimálnom zápise.
    • vstavaná funkcia (napr. v programovacom jazyku)bin(),oct(),hex()
    • metóda reťazcastr.format(), vstavané funkcieformat(), f reťazec
    • Prevedie záporné celé číslo na reťazec vo formáte dvojkovej sústavy.
  • Prevod reťazcov v binárnom, oktálnom a hexadecimálnom zápise na čísla.
    • vstavaná funkcia (napr. v programovacom jazyku)int()
  • Príklady aplikácií
    • Binárna reťazcová aritmetika
    • Prevod medzi binárnymi, oktalovými a hexadecimálnymi číslami

Zápis celých čísel v dvojkovej, osmičkovej a šestnástkovej sústave.

Pridaním nasledujúcich predpôn možno celočíselné čísla int zapísať v dvojkovej, osmičkovej a šestnástkovej sústave.
Môžete použiť aj veľké písmená.

  • Binárne číslo:0balebo0B
  • Osmičková sústava:0oalebo0O
  • Hexadecimálne číslo:0xalebo0X

Výstup funkcie print() bude v desatinnom zápise.

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

Aj s prefixom je typ celočíselný 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'>

Keďže ide o celočíselný typ, možno ho použiť na bežné aritmetické operácie.

result = 0b10 * 0o10 + 0x10
print(result)
# 32

Od verzie Python 3.6 je možné do čísel vkladať podčiarkovníky _. Opakovanie podčiarkovníka _ bude mať za následok chybu, ale môžete ich vložiť ľubovoľný počet, pokiaľ sa neopakujú.

Podčiarkovník _ nemá vplyv na číslo, takže ho možno použiť ako oddeľovač, ak je v ňom veľa číslic. Napríklad vloženie podčiarkovníka _ na každé štyri číslice je ľahko čitateľné.

print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True

bin_num = 0b1111_1111_1111
print(bin_num)
# 4095

Prevod čísel na reťazce v binárnom, oktálnom a hexadecimálnom zápise.

Ak chcete previesť číslo na reťazec v binárnom, oktálnom alebo hexadecimálnom zápise, použite nasledujúce vstavané funkcie.

  • vstavaná funkcia (napr. v programovacom jazyku)bin(),oct(),hex()
  • metóda reťazcastr.format(), vstavané funkcieformat(), f reťazec

V tejto časti sa tiež vysvetľuje, ako získať reťazec vyjadrený v dvojkovom formáte pre záporné hodnoty.

Zabudované funkcie bin(), oct(), hex()

Nasledujúce vstavané funkcie môžu konvertovať čísla na binárne, oktálové a hexadecimálne reťazce.

  • Binárne číslo:bin()
  • Osmičková sústava:oct()
  • Hexadecimálne číslo:hex()

Každá z nich vracia reťazec s nasledujúcimi prefixmi

  • Binárne číslo:0b
  • Osmičková sústava:0o
  • Hexadecimálne číslo:0x
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'>

Ak prefix nepotrebujete, použite slice[2:] na extrakciu reťazca za ním alebo použite format(), ako je vysvetlené ďalej.

print(bin(i)[2:])
print(oct(i)[2:])
print(hex(i)[2:])
# 11111111
# 377
# ff

Ak ho chcete previesť na desatinný reťazec, môžete použiť funkciu str().

print(str(i))
# 255

print(type(str(i)))
# <class 'str'>

Zabudovaná funkcia format(), metóda string str.format(), f string

Vstavaná funkcia format() a reťazcové metódy str.format() a f-string môžu tiež konvertovať čísla na binárne, oktálové a hexadecimálne reťazce.

Zadaním druhého argumentu funkcie format() nasledujúcim spôsobom ju možno previesť na binárne, oktálové a hexadecimálne reťazce.

  • Binárne číslo:b
  • Osmičková sústava:o
  • Hexadecimálne číslo: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'>

Ak chcete získať reťazec s prefixom 0b,0o,0x, pridajte do reťazca špecifikácie formátovania #.

print(format(i, '#b'))
print(format(i, '#o'))
print(format(i, '#x'))
# 0b11111111
# 0o377
# 0xff

Je tiež možné vyplniť 0 ľubovoľným počtom číslic. Upozorňujeme, že pri vypĺňaní nuly s prefixom sa musí zohľadniť aj počet znakov pre prefix (dva znaky).

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

Na konverziu možno použiť aj reťazcovú metódu str.format().

print('{:08b}'.format(i))
print('{:08o}'.format(i))
print('{:08x}'.format(i))
# 11111111
# 00000377
# 000000ff

Od verzie Python 3.6 môžete používať aj reťazec f.f'xxx'

print(f'{i:08b}')
print(f'{i:08o}')
print(f'{i:08x}')
# 11111111
# 00000377
# 000000ff

Prevedie záporné celé číslo na reťazec vo formáte dvojkovej sústavy.

Keď sa záporné celé číslo prevedie na binárny alebo hexadecimálny reťazec pomocou funkcie bin() alebo format(), absolútna hodnota bude mať znamienko mínus.

x = -9

print(x)
print(bin(x))
# -9
# -0b1001

V jazyku Python sa bitové operácie so zápornými celými číslami tiež vykonávajú v reprezentácii dvojkového doplnku. Preto ak chcete získať reťazec vyjadrený v tvare dvojkomplementu, môžete vykonať bitovú logickú operáciu OR& s maximálnym požadovaným počtom bitových číslic takto.

  • 4bit:0b1111(=0xf)
  • 8bit:0xff
  • 16bit:0xffff
print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7

Prevod reťazcov v binárnom, oktálnom a hexadecimálnom zápise na čísla.

Zabudovaná funkcia int()

Ak chcete previesť reťazec v binárnom, oktálnom alebo hexadecimálnom zápise na číslo, použite vstavanú funkciu int().

Pomocou funkcie int(string, radix) možno reťazec string v binárnom, osmičkovom, šestnástkovom atď. zápise previesť na číselný int na základe radixu. Ak je radix vynechaný, číslo sa považuje za desiatkové.

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'>

Ak je radix nastavený na 0, konverzia sa vykoná na základe nasledujúceho reťazcového prefixu.

  • Binárny prefix:0balebo0B
  • Osmičková predpona:0oalebo0O
  • Hexadecimálny prefix:0xalebo0X
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

Ak je základným číslom 0 a neexistuje prefix, prevedie sa ako desatinné číslo, ale upozorňujeme, že ak je začiatok (ľavá strana) vyplnený číslom 0, dôjde k chybe.

print(int('10', 0))
# 10

# print(int('010', 0))
# ValueError: invalid literal for int() with base 0: '010'

V ostatných prípadoch možno reťazce vyplnené nulou konvertovať tak, ako sú.

print(int('010'))
# 10

print(int('00ff', 16))
print(int('0x00ff', 0))
# 255
# 255

Ak sa reťazec nedá previesť so zadaným radixom alebo prefixom, nastane chyba.

# 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'

Príklady aplikácií

Binárna reťazcová aritmetika

Napríklad na vykonanie operácie s reťazcom v binárnom zápise s prefixom 0b.

Môžete ho jednoducho previesť na číselnú hodnotu (celé číslo typu int), vykonať s ním operácie a potom ho opäť previesť na reťazec str.

a = '0b1001'
b = '0b0011'

c = int(a, 0) + int(b, 0)

print(c)
print(bin(c))
# 12
# 0b1100

Prevod medzi binárnymi, oktalovými a hexadecimálnymi číslami

Je tiež možné ľahko konvertovať binárne, oktálové a hexadecimálne reťazce na seba navzájom. Po prevode na číselný int ho možno previesť na reťazec ľubovoľného formátu.

Vypĺňanie nulou, prefixovanie atď. možno riadiť pomocou reťazca špecifikácie formátovania.

a_0b = '0b1110001010011'

print(format(int(a, 0), '#010x'))
# 0x00000009

print(format(int(a, 0), '#010o'))
# 0o00000011
Copied title and URL