A bináris, az oktális és a hexadecimális (más néven hex) különböző számrendszerek, amelyeknek más az alapja. A bináris 2-es, az oktális 8-as, a hexadecimális 16-os alapú. A Pythonban a hétköznapi egész számok 10-es alapúak. A bináris, az oktális és a hexadecimális mind az egész számok reprezentációi. Ez azt jelenti, hogy pozitív és negatív számokat (a nullát is beleértve) ábrázolnak törtek vagy tizedesjegyek nélkül, és minden olyan műveletet támogatnak, amit egész számokkal elvégezhetünk.
A bináris egy 2-es alapú számrendszer, amely csak a 0 és az 1 számjegyet használja. Általában a számítógépek tranzisztorain és kapcsolóin átfolyó elektromos áram 0 ("kikapcsolt") és 1 ("bekapcsolt") állapotát, valamint a mágneses tárolóeszközök pozitív és negatív töltéseit reprezentálja. A bináris minden olyan egész számot ábrázolni tud, amit 10-es alapban használunk.
A 2-es alapú rendszer egy részlete így néz ki, bár a végtelenségig folytatódik, és nem áll meg a 128-nál:
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 2 ** 7 | 2 ** 6 | 2 ** 5 | 2 ** 4 | 2 ** 3 | 2 ** 2 | 2 ** 1 | 2 ** 0 |
Ha tehát a 6-ot szeretnénk binárisan ábrázolni, az 110 lesz.
| Helyiérték | 4 | 2 | 1 |
|---|---|---|---|
| Bináris szám | 1 | 1 | 0 |
A művelet pedig ez lenne: 4 + 2 + 0 = 6
Egy másik példa: 19
| Helyiérték | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|
| Bináris szám | 1 | 0 | 0 | 1 | 1 |
A bináris szám ez lenne: 10011
A művelet pedig ez lenne: 16 + 0 + 0 + 2 + 1 = 19
A Pythonban a 0b előtaggal jelölhetünk bináris literálokat.
Ha 0b10011-et írunk, a Python bináris számként értelmezi, és átváltja 10-es alapra.
>>> 0b10011
19
>>> type(0b10011)
<class 'int'>
A Pythonban a bináris csupán egy másfajta módja egy egész szám leírásának, ezért a bináris reprezentáció minden matematikai műveletnél egész számnak számít.
Ha olyan számot írunk 0b előtaggal, amely nem bináris számrendszerbeli, SyntaxError-t kapunk.
Traceback (most recent call last):
File "c:\binary.py", line 1, in <module>
0b10211
SyntaxError: invalid digit '2' in binary literal
Mivel a bináris számok egész számok, minden olyan műveletet elvégezhetünk rajtuk, amit egész számokkal is.
# addition
>>> 0b10011 + 0b10011
38
# multiplication
>>> 0b10011 * 0b10011
361
Bináris és egész reprezentációk között is végezhetünk műveleteket.
Ilyenkor azonban a szokásos matematikai műveleti szabályok érvényesek: két bináris vagy egész szám osztása float-ot ad vissza, még akkor is, ha az osztásnak nincs tizedes része.
>>> 0b10011 + 19
38
>>> 0b10011/0b10011
1.0
>>> 0b10011/3
6.333333333333333
A Python a bináris literált automatikusan int-té alakítja.
Egy int bináris reprezentációvá alakításához használjuk a beépített [bin()][bin] függvényt.
A bin() egy str-t ad vissza, amely a szám bináris megfelelője, 0b előtaggal.
>>> bin(19)
'0b10011'
Egy bináris literál egész számmá alakításához használhatjuk a beépített int() függvényt: adjuk át neki a bináris reprezentációt stringként, valamint az alapot argumentumként:
>>> int("0b10011", 2)
19
Ha rossz alapot adunk meg (vagy érvénytelen bináris reprezentációt), ValueError-t kapunk:
Traceback (most recent call last):
File "c:\binary.py", line 4, in <module>
int("0b10011", 3)
ValueError: invalid literal for int() with base 3: '0b10011'
Vannak továbbá speciális metódusok, amelyeket bináris számokon használhatunk.
A <int>.bit_length() visszaadja, hány bitre van szükség a szám reprezentálásához:
>>> 0b11011.bit_length()
5
A <int>.bit_count() visszaadja a bináris számban található egyek számát.
Például a bit_count() a „0b11011”-en 4-et ad vissza:
>>> 0b11011.bit_count()
4
Ha helyben dolgozol, a bit_count() legalább Python 3.10-et igényel.
Az Exercism online szerkesztője jelenleg a Python 3.11-ig minden funkciót támogat.
Az oktális egy 8-as alapú számrendszer. A 0, 1, 2, 3, 4, 5, 6 és 7 számjegyet használja.
A Pythonban a 0o előtaggal jelölhetjük az oktális számokat.
A binárishoz hasonlóan a Python automatikusan int-té alakítja az oktális reprezentációt.
>>> 0o123
83
A binárishoz hasonlóan az oktális számok int típusúak, és minden egész műveletet támogatnak.
Ha olyan számot írunk 0o előtaggal, amely nem oktális számrendszerbeli, SyntaxError-t kapunk.
Egy int oktális reprezentációvá alakításához használhatjuk a beépített [oct()][oct] függvényt.
Ez a bin() függvényhez hasonlóan működik, és egy stringet ad vissza:
>>> oct(83)
'0o123'
Egy oktális szám egész számmá alakításához használhatjuk az int() függvényt: adjuk át neki az oktális reprezentációt stringként és a 8-as alapot argumentumként:
>>> int("0o123", 8)
83
A binárishoz hasonlóan a rossz alap megadása ValueError-t vált ki.
A hexadecimális egy 16-os alapú számrendszer. A 0-9 számjegyeket, valamint az A, B, C, D, E és F betűket használja. Az A a 10, a B a 11, a C a 12, a D a 13, az E a 14, az F pedig a 15.
A hexadecimális számokat a Pythonban a 0x előtaggal jelölhetjük.
A binárishoz és az oktálishoz hasonlóan a Python automatikusan int-té alakítja a hexadecimális literálokat.
>>> 0x123
291
A binárishoz és az oktálishoz hasonlóan a hexadecimális literálok int típusúak, és minden egész műveletet elvégezhetsz velük.
Ha egy nem hexadecimális számot 0x előtaggal látunk el, SyntaxError-t kapunk.
Egy int hexadecimális reprezentációvá alakításához használhatjuk a beépített [hex()][hex] függvényt.
Ez a bin() függvényhez hasonlóan működik, és egy stringet ad vissza:
>>> hex(291)
'0x123'
Egy hexadecimális reprezentáció egész számmá alakításához használhatjuk az int() függvényt: adjuk át neki a hexadecimális stringet a 16-os alappal argumentumként:
>>> int("0x123", 16)
291
A binárishoz és az oktálishoz hasonlóan a rossz alap megadása itt is ValueError-t vált ki.