Muunna binääri-, oktaali- ja heksadesimaalilukuja ja merkkijonoja toisiinsa ja toisistaan Pythonissa.

liiketoiminta

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.
  • Muunna merkkijonot binääri-, oktaali- ja heksadesimaalimuodossa numeroiksi.
    • sisäänrakennettu funktio (esim. ohjelmointikielessä)int()
  • 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:0btai0B
  • Octal:0otai0O
  • Heksadesimaaliluku:0xtai0X

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
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:0btai0B
  • Octal-etuliite:0otai0O
  • Heksadesimaalinen etuliite:0xtai0X
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
Copied title and URL