Bináris, oktális és hexadecimális számok és karakterláncok konvertálása egymásba és egymásból Pythonban

Üzleti

A Python a számokat és a karakterláncokat a szokásos decimális számok mellett bináris, oktális és hexadecimális számokként is tudja kezelni. A kettő közötti konverzió is könnyen elvégezhető.

Ebben a szakaszban a következő tartalmakat ismertetjük a mintakóddal együtt.

  • Egész számok írása bináris, oktális és hexadecimális formában.
  • Számok átalakítása karakterláncokká bináris, oktális és hexadecimális jelölésekben.
    • beépített függvény (pl. programozási nyelvben)bin(),oct(),hex()
    • string módszerstr.format(), Beépített funkciókformat(), f string
    • Egy negatív egész szám átalakítása karakterlánccá kettes komplement formátumban.
  • A bináris, oktális és hexadecimális jelölésű karakterláncok számokká alakítása.
    • beépített függvény (pl. programozási nyelvben)int()
  • Alkalmazási példák
    • Bináris karakterlánc-aritmetika
    • Átváltás bináris, oktális és hexadecimális számok között

Egész számok írása bináris, oktális és hexadecimális formában.

A következő előtagok hozzáadásával az integer int számok bináris, oktális és hexadecimális formában írhatók.
Használhat nagybetűket is.

  • Bináris szám:0bvagy0B
  • Octal:0ovagy0O
  • Hexadecimális szám:0xvagy0X

A print() kimenete tizedesjegyekben lesz megadva.

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

A típus még az előtaggal együtt is integer 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'>

Mivel egész szám típusról van szó, rendszeres aritmetikai műveletekre használható.

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

A Python 3.6-tól kezdődően a számok közé _ aláhúzás is beilleszthető. Az _ aláhúzás megismétlése hibát eredményez, de annyi aláhúzást illeszthetsz be, amennyit csak akarsz, amíg nem ismétled meg.

Az _ aláhúzás nem befolyásolja a számot, így sok számjegy esetén elválasztóként használható. Például négy számjegyenként egy _ aláhúzás beillesztése könnyen olvasható.

print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True

bin_num = 0b1111_1111_1111
print(bin_num)
# 4095

Számok átalakítása karakterláncokká bináris, oktális és hexadecimális jelölésekben.

Ha egy számot bináris, oktális vagy hexadecimális jelölésű karakterlánccá szeretne alakítani, használja a következő beépített függvényeket.

  • beépített függvény (pl. programozási nyelvben)bin(),oct(),hex()
  • string módszerstr.format(), Beépített funkciókformat(), f string

Ez a szakasz azt is elmagyarázza, hogyan kaphatunk egy stringet kettes komplement formátumban kifejezve negatív értékek esetén.

Beépített bin(), oct(), hex() függvények

A következő beépített függvények a számokat bináris, oktális és hexadecimális karakterláncokká alakíthatják.

  • Bináris szám:bin()
  • Octal:oct()
  • Hexadecimális szám:hex()

Mindegyik a következő előtagokkal rendelkező karakterláncot adja vissza

  • Bináris szám:0b
  • Octal:0o
  • Hexadecimális szám: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'>

Ha nincs szükséged az előtagra, használd a slice[2:] parancsot a mögötte lévő karakterlánc kivonásához, vagy használd a format() parancsot a következőkben leírtak szerint.

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

Ha decimális karakterlánccá akarod konvertálni, használhatod a str() függvényt.

print(str(i))
# 255

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

Beépített függvény format(), string módszer str.format(), f string

A beépített format() függvény, valamint az str.format() és az f-string karakterlánc-módszerek a számokat bináris, oktális és hexadecimális karakterláncokká is átalakíthatják.

A format() második argumentumát az alábbiak szerint megadva bináris, oktális és hexadecimális karakterláncokká alakíthatjuk.

  • Bináris szám:b
  • Octal:o
  • Hexadecimális szám: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'>

Ha 0b,0o,0x előtaggal rendelkező karakterláncot szeretne kapni, adjon hozzá #-t a formázási specifikációs karakterlánchoz.

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

A 0-t tetszőleges számjegyekkel is ki lehet tölteni. Vegye figyelembe, hogy az előtag karaktereinek számát (két karakter) is figyelembe kell venni, amikor a nullát előtaggal tölti ki.

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

A string módszer str.format() is használható a konvertálásra.

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

A Python 3.6-tól kezdve az f karakterlánc is használható.f'xxx'

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

Egy negatív egész szám átalakítása karakterlánccá kettes komplement formátumban.

Amikor egy negatív egész számot bin() vagy format() segítségével bináris vagy hexadecimális karakterlánccá alakítunk, az abszolút érték mínusz előjelet kap.

x = -9

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

A Pythonban a negatív egész számokkal végzett bitenkénti műveletek szintén a kettes komplement ábrázolásban történnek. Ezért ha egy karakterláncot akarunk megkapni kettes komplement formában kifejezve, akkor a bitenkénti logikai VAGY&-ot a maximálisan szükséges számú bitjegyekkel a következőképpen végezhetjük el.

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

A bináris, oktális és hexadecimális jelölésű karakterláncok számokká alakítása.

Beépített int() függvény

Egy bináris, oktális vagy hexadecimális jelölésű karakterlánc számmá alakításához használja az int() beépített függvényt.

Az int(string, radix) segítségével egy string str bináris, oktális, hexadecimális, stb. jelölésű karakterláncot a radix alapján numerikus int értékké alakíthatunk. Ha a radixot elhagyjuk, a számot decimálisnak tekintjük.

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

Ha a radix 0-ra van állítva, a konverzió a következő karakterlánc-előtag alapján történik.

  • Bináris előtag:0bvagy0B
  • Oktális előtag:0ovagy0O
  • Hexadecimális előtag:0xvagy0X
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

Ha az alapszám 0, és nincs előtag, akkor a szám decimális számként lesz átalakítva, de vegye figyelembe, hogy ha az elején (bal oldalon) 0 van, akkor hiba lép fel.

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

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

Más esetekben a nullával kitöltött karakterláncok változatlanul konvertálhatók.

print(int('010'))
# 10

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

Ha a karakterlánc nem konvertálható a megadott radixszal vagy előtaggal, hiba lép fel.

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

Alkalmazási példák

Bináris karakterlánc-aritmetika

Például egy művelet elvégzése a 0b előtaggal rendelkező, bináris jelölésű karakterláncon.

Könnyen átalakíthatod numerikus értékké (int típusú egész szám), műveleteket végezhetsz rajta, majd visszaalakíthatod str karakterlánccá.

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

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

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

Átváltás bináris, oktális és hexadecimális számok között

A bináris, oktális és hexadecimális karakterláncok egymáshoz való átalakítása is egyszerű. Ha egyszer numerikus int-be konvertáltuk, az bármilyen formátumú karakterlánccá konvertálható.

A nullfeltöltés, előtagozás stb. a formázási specifikációs karakterlánccal szabályozható.

a_0b = '0b1110001010011'

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

print(format(int(a, 0), '#010o'))
# 0o00000011