Převod binárních, oktalových a hexadecimálních čísel a řetězců z a do jazyka Python

Podnikání

Python umí pracovat s čísly a řetězci v binární, osmičkové a šestnáctkové soustavě i s obvyklými desítkovými čísly. Mezi nimi lze také snadno převádět.

V této části bude vysvětlen následující obsah a ukázkový kód.

  • Zápis celých čísel ve dvojkové, osmičkové a šestnáctkové soustavě.
  • Převod čísel na řetězce v binárním, osmičkovém a šestnáctkovém zápisu.
    • vestavěná funkce (např. v programovacím jazyce)bin(),oct(),hex()
    • metoda řetězcestr.format(), vestavěné funkceformat(), f řetězec
    • Převede záporné celé číslo na řetězec ve formátu dvojkového doplňku.
  • Převod řetězců v binárním, osmičkovém a šestnáctkovém zápisu na čísla.
    • vestavěná funkce (např. v programovacím jazyce)int()
  • Příklady použití
    • Binární řetězcová aritmetika
    • Převod mezi binárními, osmičkovými a šestnáctkovými čísly

Zápis celých čísel ve dvojkové, osmičkové a šestnáctkové soustavě.

Přidáním následujících předpon lze celá čísla int zapsat ve dvojkové, osmičkové a šestnáctkové soustavě.
Můžete také použít velká písmena.

  • Binární číslo:0bnebo0B
  • Osmičková soustava:0onebo0O
  • Hexadecimální číslo:0xnebo0X

Výstup funkce print() bude v desítkové soustavě.

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

I s předponou je typem celé číslo 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'>

Jelikož se jedná o typ integer, lze jej použít pro běžné aritmetické operace.

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

Od verze Python 3.6 je možné do čísel vkládat podtržítka _. Opakování podtržítka _ bude mít za následek chybu, ale můžete jich vložit libovolný počet, pokud je nebudete opakovat.

Podtržítko _ neovlivňuje číslo, takže jej lze použít jako oddělovač při velkém počtu číslic. Například vložení podtržítka _ na každé čtyři číslice je snadno čitelné.

print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True

bin_num = 0b1111_1111_1111
print(bin_num)
# 4095

Převod čísel na řetězce v binárním, osmičkovém a šestnáctkovém zápisu.

Chcete-li převést číslo na řetězec v binárním, osmičkovém nebo šestnáctkovém zápisu, použijte následující vestavěné funkce.

  • vestavěná funkce (např. v programovacím jazyce)bin(),oct(),hex()
  • metoda řetězcestr.format(), vestavěné funkceformat(), f řetězec

V této části je také vysvětleno, jak získat řetězec vyjádřený ve formátu dvojkového doplňku pro záporné hodnoty.

Vestavěné funkce bin(), oct(), hex()

Následující vestavěné funkce mohou převádět čísla na binární, oktalové a hexadecimální řetězce.

  • Binární číslo:bin()
  • Osmičková soustava:oct()
  • Hexadecimální číslo:hex()

Každá z nich vrací řetězec s následujícími předponami

  • Binární číslo:0b
  • Osmičková soustava:0o
  • Hexadecimální čí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'>

Pokud prefix nepotřebujete, použijte slice[2:] pro extrakci řetězce za ním nebo použijte format(), jak je vysvětleno dále.

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

Pokud jej chcete převést na desetinný řetězec, můžete použít funkci str().

print(str(i))
# 255

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

Vestavěná funkce format(), metoda string str.format(), f string

Vestavěná funkce format() a řetězcové metody str.format() a f-string mohou také převádět čísla na binární, osmičkové a šestnáctkové řetězce.

Zadáním druhého argumentu funkce format() následujícím způsobem ji lze převést na binární, oktalový a hexadecimální řetězec.

  • Binární číslo:b
  • Osmičková soustava:o
  • Hexadecimální čí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'>

Pokud chcete získat řetězec s prefixem 0b,0o,0x, přidejte do řetězce specifikace formátování #.

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

Je také možné vyplnit 0 libovolným počtem číslic. Všimněte si, že při vyplňování nuly s předčíslím je třeba vzít v úvahu také počet znaků pro předčíslí (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

K převodu lze použít i řetězcovou metodu str.format().

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

Od verze Python 3.6 můžete používat také řetězec f.f'xxx'

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

Převede záporné celé číslo na řetězec ve formátu dvojkového doplňku.

Při převodu záporného celého čísla na binární nebo hexadecimální řetězec pomocí funkce bin() nebo format() bude mít absolutní hodnota znaménko minus.

x = -9

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

V jazyce Python se bitové operace se zápornými celými čísly provádějí také v reprezentaci dvojkového doplňku. Pokud tedy chcete získat řetězec vyjádřený ve formě dvojkového doplňku, můžete provést bitovou logickou operaci OR& s maximálním požadovaným počtem bitových číslic, a to následujícím způsobem.

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

Převod řetězců v binárním, osmičkovém a šestnáctkovém zápisu na čísla.

Vestavěná funkce int()

Chcete-li převést řetězec v binárním, osmičkovém nebo šestnáctkovém zápisu na číslo, použijte vestavěnou funkci int().

Pomocí funkce int(string, radix) lze řetězec string v binárním, osmičkovém, šestnáctkovém zápisu atd. převést na číselný řetězec int na základě radixu. Pokud je radix vynechán, považuje se číslo za desítkové.

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

Pokud je radix nastaven na 0, převod se provede na základě následujícího řetězcového prefixu.

  • Binární předpona:0bnebo0B
  • Osmičková předpona:0onebo0O
  • Hexadecimální předpona:0xnebo0X
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

Pokud je základním číslem 0 a není zde žádný prefix, bude převedeno jako desetinné číslo, ale uvědomte si, že pokud je začátek (levá strana) vyplněn 0, dojde k chybě.

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

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

V ostatních případech lze řetězce vyplněné nulou převést tak, jak jsou.

print(int('010'))
# 10

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

Pokud řetězec nelze převést pomocí zadaného radixu nebo prefixu, dojde k chybě.

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

Příklady použití

Binární řetězcová aritmetika

Chcete-li například provést operaci s řetězcem v binárním zápisu s prefixem 0b.

Můžete jej snadno převést na číselnou hodnotu (celé číslo typu int), provádět s ním operace a pak jej opět převést na řetězec str.

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

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

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

Převod mezi binárními, osmičkovými a šestnáctkovými čísly

Snadno lze také převádět binární, oktalové a hexadecimální řetězce. Po převodu na číselný int jej lze převést na řetězec libovolného formátu.

Vyplňování nul, prefixování atd. lze řídit pomocí řetězce specifikace formátování.

a_0b = '0b1110001010011'

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

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