Python osaa käsitellä lukuja ja merkkijonoja binääri-, oktaali- ja heksadesimaalilukuina sekä tavallisten desimaalilukujen lisäksi. Niiden välillä on myös helppo tehdä muunnos.
Tässä osiossa selitetään seuraava sisältö sekä esimerkkikoodi.
- Kirjoita kokonaislukuja binääri-, oktaali- ja heksadesimaalilukuina.
- Muunna numerot merkkijonoiksi binääri-, oktaali- ja heksadesimaalimuodossa.
- sisäänrakennettu funktio (esim. ohjelmointikielessä)
bin()
,oct()
,hex()
- merkkijonomenetelmä
str.format()
, Sisäänrakennetut toiminnotformat()
, f merkkijono - Muunna negatiivinen kokonaisluku merkkijonoksi kaksoiskomplementtimuodossa.
- sisäänrakennettu funktio (esim. ohjelmointikielessä)
- Muunna merkkijonot binääri-, oktaali- ja heksadesimaalimuodossa numeroiksi.
- sisäänrakennettu funktio (esim. ohjelmointikielessä)
int()
- sisäänrakennettu funktio (esim. ohjelmointikielessä)
- Sovellusesimerkkejä
- Binäärijonojen aritmetiikka
- Muunna binääri-, oktaali- ja heksadesimaalilukujen välille.
Kirjoita kokonaislukuja binääri-, oktaali- ja heksadesimaalilukuina.
Lisäämällä seuraavat etuliitteet kokonaisluvut int voidaan kirjoittaa binääri-, oktaali- ja heksadesimaalilukuna.
Voit käyttää myös isoja kirjaimia.
- Binääriluku:
0b
tai0B
- Octal:
0o
tai0O
- Heksadesimaaliluku:
0x
tai0X
Print():n tuloste on desimaalimerkintä.
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
Etuliitteen jälkeenkin tyyppi on kokonaisluku 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'>
Koska se on kokonaislukutyyppi, sitä voidaan käyttää tavallisiin aritmeettisiin operaatioihin.
result = 0b10 * 0o10 + 0x10
print(result)
# 32
Python 3.6:sta alkaen on mahdollista lisätä numeroiden sisään _-merkkejä. Alleviivauksen _ toistaminen aiheuttaa virheen, mutta voit lisätä niin monta kuin haluat, kunhan et toista sitä.
Alleviivaus _ ei vaikuta numeroon, joten sitä voidaan käyttää erottimena, kun numeroita on monta. Esimerkiksi, jos alleviivaus _ lisätään neljän numeron välein, se on helppo lukea.
print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True
bin_num = 0b1111_1111_1111
print(bin_num)
# 4095
Muunna numerot merkkijonoiksi binääri-, oktaali- ja heksadesimaalimuodossa.
Voit muuntaa numeron merkkijonoksi binääri-, oktaali- tai heksadesimaalimuodossa käyttämällä seuraavia sisäänrakennettuja funktioita.
- sisäänrakennettu funktio (esim. ohjelmointikielessä)
bin()
,oct()
,hex()
- merkkijonomenetelmä
str.format()
, Sisäänrakennetut toiminnotformat()
, f merkkijono
Tässä osiossa selitetään myös, miten saat merkkijonon ilmaistua kaksoiskomplementtimuodossa negatiivisille arvoille.
Sisäänrakennetut funktiot bin(), oct(), hex() ja hex().
Seuraavat sisäänrakennetut funktiot voivat muuntaa numeroita binääri-, oktaali- ja heksadesimaalijonoiksi.
- Binääriluku:
bin()
- Octal:
oct()
- Heksadesimaaliluku:
hex()
Kumpikin palauttaa merkkijonon, jossa on seuraavat etuliitteet
- Binääriluku:
0b
- Octal:
0o
- Heksadesimaaliluku:
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'>
Jos et tarvitse etuliitettä, käytä slice[2:]:a sen takana olevan merkkijonon poimimiseen tai käytä format()-ohjelmaa, kuten seuraavassa selitetään.
print(bin(i)[2:])
print(oct(i)[2:])
print(hex(i)[2:])
# 11111111
# 377
# ff
Jos haluat muuntaa sen desimaalijonoksi, voit käyttää komentoa str().
print(str(i))
# 255
print(type(str(i)))
# <class 'str'>
Sisäänrakennettu funktio format(), merkkijonomenetelmä str.format(), f string
Sisäänrakennettu funktio format() ja merkkijonomenetelmät str.format() ja f-string voivat myös muuntaa numerot binääri-, oktaali- ja heksadesimaalijonoiksi.
Määrittämällä format():n toinen argumentti seuraavasti, se voidaan muuntaa binääri-, oktaali- ja heksadesimaalijonoiksi.
- Binääriluku:
b
- Octal:
o
- Heksadesimaaliluku:
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'>
Jos haluat saada merkkijonon, jonka etuliite on 0b,0o,0x, lisää muotoilun määrittelymerkkijonoon #.
print(format(i, '#b'))
print(format(i, '#o'))
print(format(i, '#x'))
# 0b11111111
# 0o377
# 0xff
Myös 0 voidaan täyttää millä tahansa numerolla. Huomaa, että myös etuliitteen merkkien määrä (kaksi merkkiä) on otettava huomioon, kun nollaa täydennetään etuliitteellä.
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
Myös merkkijonomenetelmää str.format() voidaan käyttää muuntamiseen.
print('{:08b}'.format(i))
print('{:08o}'.format(i))
print('{:08x}'.format(i))
# 11111111
# 00000377
# 000000ff
Python 3.6:sta lähtien voit käyttää myös merkkijonoa f.f'xxx'
print(f'{i:08b}')
print(f'{i:08o}')
print(f'{i:08x}')
# 11111111
# 00000377
# 000000ff
Muunna negatiivinen kokonaisluku merkkijonoksi kaksoiskomplementtimuodossa.
Kun negatiivinen kokonaisluku muunnetaan binääriseksi tai heksadesimaaliseksi merkkijonoksi bin()- tai format()-ohjelmalla, absoluuttiseen arvoon tulee miinusmerkki.
x = -9
print(x)
print(bin(x))
# -9
# -0b1001
Pythonissa myös negatiivisten kokonaislukujen bittikohtaiset operaatiot suoritetaan kaksoiskomplementtinä. Jos siis haluat saada merkkijonon ilmaistuna kaksoiskomplementtimuodossa, voit tehdä bittiperusteisen loogisen OR&-operaation, jossa on tarvittava enimmäismäärä bitinumeroita, seuraavasti.
- 4bit:
0b1111(=0xf)
- 8bit:
0xff
- 16bit:
0xffff
print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7
Muunna merkkijonot binääri-, oktaali- ja heksadesimaalimuodossa numeroiksi.
Sisäänrakennettu funktio int()
Jos haluat muuntaa merkkijonon binääri-, oktaali- tai heksadesimaalimuodossa numeroksi, käytä sisäänrakennettua funktiota int().
Käyttämällä int(string, radix) merkkijono str binääri-, oktaali-, heksadesimaalimuodossa jne. voidaan muuntaa numeeriseksi int:ksi radixin perusteella. Jos radix jätetään pois, numeron katsotaan olevan desimaaliluku.
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'>
Jos radix on asetettu arvoon 0, muunnos tehdään seuraavan merkkijonon etuliitteen perusteella.
- Binäärinen etuliite:
0b
tai0B
- Octal-etuliite:
0o
tai0O
- Heksadesimaalinen etuliite:
0x
tai0X
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
Jos perusluku on 0 eikä etuliitettä ole, se muunnetaan desimaaliluvuksi, mutta huomaa, että jos alussa (vasemmalla puolella) on 0, tapahtuu virhe.
print(int('10', 0))
# 10
# print(int('010', 0))
# ValueError: invalid literal for int() with base 0: '010'
Muissa tapauksissa nollatäytteiset merkkijonot voidaan muuntaa sellaisenaan.
print(int('010'))
# 10
print(int('00ff', 16))
print(int('0x00ff', 0))
# 255
# 255
Jos merkkijonoa ei voida muuntaa määritetyn radeksin tai etuliitteen avulla, tapahtuu virhe.
# 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'
Sovellusesimerkkejä
Binäärijonojen aritmetiikka
Voit esimerkiksi suorittaa operaation merkkijonolle binäärimuodossa, jonka etuliite on 0b.
Voit helposti muuntaa sen numeeriseksi arvoksi (kokonaislukutyyppi int), suorittaa sille operaatioita ja muuntaa sen sitten takaisin merkkijonoksi str.
a = '0b1001'
b = '0b0011'
c = int(a, 0) + int(b, 0)
print(c)
print(bin(c))
# 12
# 0b1100
Muunna binääri-, oktaali- ja heksadesimaalilukujen välille.
Myös binääri-, oktaali- ja heksadesimaalijonojen muuntaminen toisiinsa on helppoa. Kun se on muunnettu numeeriseksi int:ksi, se voidaan muuntaa minkä tahansa muotoiseksi merkkijonoksi.
Nollatäyttöä, etuliitteitä jne. voidaan hallita muotoilun määrittelymerkkijonolla.
a_0b = '0b1110001010011'
print(format(int(a, 0), '#010x'))
# 0x00000009
print(format(int(a, 0), '#010o'))
# 0o00000011