Konvertera binära, oktala och hexadecimala tal och strängar till och från varandra i Python

Företag

Python kan hantera tal och strängar som binära, oktala och hexadecimala tal samt de vanliga decimala talen. Det är också lätt att konvertera mellan dem.

I det här avsnittet förklaras följande innehåll tillsammans med exempelkod.

  • Skriv helheter i binär, oktal och hexadecimal form.
  • Konvertera tal till strängar i binär, oktal och hexadecimal notation.
    • inbyggd funktion (t.ex. i ett programmeringsspråk)bin(),oct(),hex()
    • strängmetodstr.format(), Inbyggda funktionerformat(), f sträng
    • Konvertera ett negativt heltal till en sträng i tvåkomplementsformat.
  • Konvertera strängar i binär, oktal och hexadecimal notation till siffror.
    • inbyggd funktion (t.ex. i ett programmeringsspråk)int()
  • Exempel på tillämpningar
    • Aritmetik för binära strängar
    • Konvertera mellan binära, oktala och hexadecimala tal.

Skriv helheter i binär, oktal och hexadecimal form.

Genom att lägga till följande prefix kan heltalstal int skrivas i binär, oktal respektive hexadecimal form.
Du kan också använda stora bokstäver.

  • Binärt tal:0beller .0B
  • Oktal:0oeller .0O
  • Hexadecimaltal:0xeller .0X

Utmatningen av print() kommer att vara i decimalnotering.

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

Även med prefixet är typen ett heltal 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'>

Eftersom det är en heltalstyp kan den användas för vanliga aritmetiska operationer.

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

Från och med Python 3.6 är det möjligt att infoga understrykningar _ i siffror. Upprepning av ett understreck _ resulterar i ett fel, men du kan infoga hur många du vill så länge du inte upprepar det.

Understrykningen _ påverkar inte talet, så den kan användas som en separator när det finns många siffror. Det är till exempel lätt att läsa om man sätter in ett understryk _ var fjärde siffra.

print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True

bin_num = 0b1111_1111_1111
print(bin_num)
# 4095

Konvertera tal till strängar i binär, oktal och hexadecimal notation.

Om du vill konvertera ett tal till en sträng i binär, oktal eller hexadecimal notation använder du följande inbyggda funktioner.

  • inbyggd funktion (t.ex. i ett programmeringsspråk)bin(),oct(),hex()
  • strängmetodstr.format(), Inbyggda funktionerformat(), f sträng

I det här avsnittet förklaras också hur man får fram en sträng uttryckt i tvåkomplementsformat för negativa värden.

Inbyggda funktioner bin(), oct(), hex()

Följande inbyggda funktioner kan konvertera tal till binära, oktala och hexadecimala strängar.

  • Binärt tal:bin()
  • Oktal:oct()
  • Hexadecimaltal:hex()

Var och en returnerar en sträng med följande prefix

  • Binärt tal:0b
  • Oktal:0o
  • Hexadecimaltal: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'>

Om du inte behöver prefixet kan du använda slice[2:] för att extrahera strängen bakom det, eller använda format() som förklaras nedan.

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

Om du vill konvertera den till en decimalsträng kan du använda str().

print(str(i))
# 255

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

Inbyggd funktion format(), strängmetod str.format(), f sträng

Den inbyggda funktionen format() och strängmetoderna str.format() och f-string kan också konvertera tal till binära, oktala och hexadecimala strängar.

Genom att ange det andra argumentet för format() enligt följande kan det konverteras till binära, oktala respektive hexadecimala strängar.

  • Binärt tal:b
  • Oktal:o
  • Hexadecimaltal: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'>

Om du vill få en sträng med prefixet 0b,0o,0x lägger du till # i formateringsspecifikationssträngen.

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

Det är också möjligt att fylla i 0 med ett valfritt antal siffror. Observera att antalet tecken för prefixet (två tecken) också måste beaktas när nollan fylls i med ett prefix.

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

Strängmetoden str.format() kan också användas för konvertering.

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

Från och med Python 3.6 kan du också använda strängen f.f'xxx'

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

Konvertera ett negativt heltal till en sträng i tvåkomplementsformat.

När ett negativt heltal konverteras till en binär eller hexadecimal sträng med bin() eller format() får det absoluta värdet ett minustecken.

x = -9

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

I Python utförs bitvisa operationer på negativa heltal också i tvåkomplementsrepresentation. Om du vill få fram en sträng uttryckt i tvåkomplementsform kan du därför göra en bitvis logisk OR& med det maximala antalet bitsiffror som krävs, enligt följande.

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

Konvertera strängar i binär, oktal och hexadecimal notation till siffror.

Inbyggd funktion int()

Om du vill konvertera en sträng i binär, oktal eller hexadecimal notation till ett tal använder du den inbyggda funktionen int().

Med int(sträng, radix) kan en sträng str i binär, oktal, hexadecimal notation etc. konverteras till ett numeriskt int baserat på radix. Om radix utelämnas anses talet vara decimaltal.

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

Om radix är satt till 0 görs konverteringen baserat på följande strängprefix.

  • Binärt prefix:0beller .0B
  • Oktalt prefix:0oeller .0O
  • Hexadecimalt prefix:0xeller .0X
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

Om basnumret är 0 och det inte finns något prefix konverteras det som ett decimaltal, men observera att om början (vänster sida) är fylld med 0 uppstår ett fel.

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

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

I andra fall kan nollfyllda strängar konverteras som de är.

print(int('010'))
# 10

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

Om strängen inte kan konverteras med det angivna radixet eller prefixet uppstår ett fel.

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

Exempel på tillämpningar

Aritmetik för binära strängar

Om du till exempel vill utföra en operation på en sträng i binär notation med prefixet 0b.

Du kan enkelt konvertera den till ett numeriskt värde (heltalstyp int), utföra operationer på den och sedan konvertera den tillbaka till en sträng str igen.

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

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

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

Konvertera mellan binära, oktala och hexadecimala tal.

Det är också lätt att konvertera binära, oktala och hexadecimala strängar till varandra. När det väl har konverterats till ett numeriskt int kan det konverteras till en sträng i vilket format som helst.

Nollfyllning, prefixering osv. kan styras med hjälp av strängen för formateringsspecifikation.

a_0b = '0b1110001010011'

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

print(format(int(a, 0), '#010o'))
# 0o00000011
Copied title and URL