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.
- innbyggð aðgerð (t.d. í forritunarmáli)
- Umbreyttu strengi í tvíundar-, áttundar- og sextánsnúmerum í tölur.
- innbyggð aðgerð (t.d. í forritunarmáli)
int()
- innbyggð aðgerð (t.d. í forritunarmáli)
- 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:
0b
eða0B
- Octal:
0o
eða0O
- Sextándanúmer:
0x
eð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
- 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'>
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:
0b
eða0B
- Octal forskeyti:
0o
eða0O
- Sextánstafa forskeyti:
0x
eð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