Umbreyttu tvíundir, áttund og sextán talna og strengi til og frá hvor öðrum í Python

Viðskipti

Python getur meðhöndlað tölur og strengi sem tvöfalda, áttunda og sextánda tölu auk venjulegra aukastafa. Það er líka auðvelt að breyta á milli þeirra.

Í þessum hluta verður eftirfarandi innihald útskýrt ásamt sýnishornskóða.

  • Skrifaðu heiltölur í tvíundir, áttund og sextánda tölu.
  • Umbreyttu tölum í strengi í tvíundar-, áttundar- og sextánsnúmerum.
    • innbyggð aðgerð (t.d. í forritunarmáli)bin(),oct(),hex()
    • strengjaaðferðstr.format(), Innbyggðar aðgerðirformat(), f strengur
    • Umbreyttu neikvæðri heiltölu í streng á tveggja complement sniði.
  • Umbreyttu strengi í tvíundar-, áttundar- og sextánsnúmerum í tölur.
    • innbyggð aðgerð (t.d. í forritunarmáli)int()
  • Dæmi um notkun
    • Tvöfaldur strengjareikningur
    • Umbreyta á milli tvíundar-, áttundar- og sextántalna

Skrifaðu heiltölur í tvíundir, áttund og sextánda tölu.

Með því að bæta við eftirfarandi forskeytum er hægt að skrifa heiltölu int tölur í tvöfalda, áttundu og sextánda tölu í sömu röð.
Þú getur líka notað hástafi.

  • Tvöfaldur tala:0beða0B
  • Octal:0oeða0O
  • Sextándanúmer:0xeða0X

Úttak print() verður með aukastaf.

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

Jafnvel með forskeytinu er tegundin heiltala 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'>

Þar sem það er heiltölutegund er hægt að nota það fyrir venjulegar reikniaðgerðir.

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

Frá og með Python 3.6 er hægt að setja inn undirstrik _ í tölustöfum. Að endurtaka undirstrik _ mun leiða til villu, en þú getur sett inn eins marga og þú vilt svo framarlega sem þú endurtekur það ekki.

_ undirstrikið hefur ekki áhrif á töluna og því er hægt að nota það sem skilju þegar tölustafir eru margir. Til dæmis er auðvelt að lesa það að setja inn undirstrik _ á fjögurra stafa tölu.

print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True

bin_num = 0b1111_1111_1111
print(bin_num)
# 4095

Umbreyttu tölum í strengi í tvíundar-, áttundar- og sextánsnúmerum.

Til að umbreyta tölu í streng í tvíundar-, áttundar- eða sextánsnúmer, notaðu eftirfarandi innbyggðu aðgerðir.

  • innbyggð aðgerð (t.d. í forritunarmáli)bin(),oct(),hex()
  • strengjaaðferðstr.format(), Innbyggðar aðgerðirformat(), f strengur

Þessi hluti útskýrir einnig hvernig á að fá streng birtan á tveggja viðbótarsniði fyrir neikvæð gildi.

Innbyggðar aðgerðir bin(), oct(), hex()

Eftirfarandi innbyggðu aðgerðir geta umbreytt tölum í tvöfalda, áttunda og sextánda strengi.

  • Tvöfaldur tala:bin()
  • Octal:oct()
  • Sextándanúmer:hex()

Hver skilar streng með eftirfarandi forskeytum

  • Tvöfaldur tala:0b
  • Octal:0o
  • Sextándanúmer: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'>

Ef þú þarft ekki forskeytið, notaðu sneið[2:] til að draga út strenginn fyrir aftan hann, eða notaðu format() eins og útskýrt er næst.

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

Ef þú vilt breyta því í tugastreng geturðu notað str().

print(str(i))
# 255

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

Innbyggt fallsnið(), strengjaaðferð str.format(), f strengur

Innbyggt fallsnið() og strengjaaðferðirnar str.format() og f-strengur geta einnig umbreytt tölum í tvöfalda, áttunda og sextánda strengi.

Með því að tilgreina seinni röksemd format() sem hér segir, er hægt að breyta þeim í tvöfalda, áttunda og sextánda strengi, í sömu röð.

  • Tvöfaldur tala:b
  • Octal:o
  • Sextándanúmer: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'>

Ef þú vilt fá streng með forskeytinu 0b,0o,0x skaltu bæta # við sniðforskriftarstrenginn.

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

Það er líka hægt að fylla út 0 með hvaða tölu sem er. Athugið að einnig þarf að taka tillit til fjölda stafa fyrir forskeytið (tveir stafir) þegar fyllt er út núll með forskeyti.

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

Strengjaaðferðina str.format() er einnig hægt að nota fyrir umbreytingu.

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

Frá og með Python 3.6 geturðu líka notað f strenginn.f'xxx'

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

Umbreyttu neikvæðri heiltölu í streng á tveggja complement sniði.

Þegar neikvæðri heiltölu er breytt í tvíundar- eða sextándegisstreng með því að nota bin() eða format(), mun algildið hafa mínusmerki.

x = -9

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

Í Python eru bitaaðgerðir á neikvæðum heiltölum einnig gerðar í samhljóðaframsetningu tveggja. Þess vegna, ef þú vilt fá streng tjáðan í tvöföldu formi, geturðu tekið bitalega rökrétt OR& með hámarksfjölda bitastafa sem krafist er, sem hér segir.

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

Umbreyttu strengi í tvíundar-, áttundar- og sextánsnúmerum í tölur.

Innbyggð aðgerð int()

Notaðu innbyggða fallið int() til að umbreyta streng í tvíundar-, áttundar- eða sextánsnúmer í tölu.

Með int(streng, radix) er hægt að breyta streng str í tvíundar-, áttundar-, sextándegissniði o.s.frv. í tölulegan int sem byggir á radixnum. Ef radix er sleppt telst talan vera aukastaf.

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

Ef radix er stillt á 0 er umbreytingin gerð út frá eftirfarandi strengjaforskeyti.

  • Tvöfaldur forskeyti:0beða0B
  • Octal forskeyti:0oeða0O
  • Sextánstafa forskeyti:0xeða0X
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

Ef grunntalan er 0 og ekkert forskeyti er henni breytt sem aukastaf, en athugaðu að ef upphafið (vinstra megin) er fyllt með 0 kemur villa.

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

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

Í öðrum tilvikum er hægt að breyta núllfylltum strengjum eins og þeir eru.

print(int('010'))
# 10

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

Ef ekki er hægt að breyta strengnum með tilgreindum radix eða forskeyti kemur villa.

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

Dæmi um notkun

Tvöfaldur strengjareikningur

Til dæmis til að framkvæma aðgerð á streng í tvíundarskrift með forskeytinu 0b.

Þú getur auðveldlega umbreytt því í tölugildi (heiltölutegund int), framkvæmt aðgerðir á því og síðan breytt því aftur í streng str aftur.

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

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

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

Umbreyta á milli tvíundar-, áttundar- og sextántalna

Það er líka auðvelt að umbreyta tvíundar-, áttundar- og sextándastrengjum hver í annan. Þegar það hefur verið breytt í tölulegt int er hægt að breyta því í streng af hvaða sniði sem er.

Núllfyllingu, forskeyti osfrv. er hægt að stjórna með forskriftarstrengnum.

a_0b = '0b1110001010011'

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

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