Konverter binære, oktale og hexadecimale tal og strenge til og fra hinanden i Python

Forretning

Python kan håndtere tal og strenge som binære, oktale og hexadecimale tal samt de sædvanlige decimaltal. Det er også nemt at konvertere mellem dem.

I dette afsnit vil følgende indhold blive forklaret sammen med kodeeksempler.

  • Skriv hele tal i binære, oktale og hexadecimale tal.
  • Konverter tal til strenge i binær, oktal- og hexadecimal notation.
    • indbygget funktion (f.eks. i et programmeringssprog)bin(),oct(),hex()
    • strengmetodestr.format(), Indbyggede funktionerformat(), f streng
    • Konverter et negativt heltal til en streng i tokomplementformat.
  • Konverter strenge i binær, oktal- og hexadecimal notation til tal.
    • indbygget funktion (f.eks. i et programmeringssprog)int()
  • Eksempler på anvendelse
    • Aritmetik med binære strenge
    • Konverter mellem binære, oktale og hexadecimale tal

Skriv hele tal i binære, oktale og hexadecimale tal.

Ved at tilføje følgende præfikser kan hele int-taller skrives i henholdsvis binær, oktal og hexadecimal form.
Du kan også bruge store bogstaver.

  • Binært tal:0beller0B
  • oktal:0oeller0O
  • Hexadecimalt tal:0xeller0X

Output af print() vil være i decimal notation.

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

Selv med præfikset er typen et 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'>

Da det er en heltalstype, kan den bruges til almindelige aritmetiske operationer.

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

Fra og med Python 3.6 er det muligt at indsætte understregninger _ i tal. Gentagelse af en understregning _ vil resultere i en fejl, men du kan indsætte så mange du vil, så længe du ikke gentager den.

Understregningen _ påvirker ikke tallet, så den kan bruges som separator, når der er mange cifre. Hvis du f.eks. indsætter en understregning _ for hvert fjerde ciffer, er det let at læse.

print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True

bin_num = 0b1111_1111_1111
print(bin_num)
# 4095

Konverter tal til strenge i binær, oktal- og hexadecimal notation.

Hvis du vil konvertere et tal til en streng i binær, oktal- eller hexadecimal notation, skal du bruge følgende indbyggede funktioner.

  • indbygget funktion (f.eks. i et programmeringssprog)bin(),oct(),hex()
  • strengmetodestr.format(), Indbyggede funktionerformat(), f streng

I dette afsnit forklares det også, hvordan man får en streng udtrykt i tokomplementformat for negative værdier.

Indbyggede funktioner bin(), oct(), hex()

Følgende indbyggede funktioner kan konvertere tal til binære, oktale og hexadecimale strenge.

  • Binært tal:bin()
  • oktal:oct()
  • Hexadecimalt tal:hex()

Hver returnerer en streng med følgende præfikser

  • Binært tal:0b
  • oktal:0o
  • Hexadecimalt tal: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'>

Hvis du ikke har brug for præfikset, kan du bruge slice[2:] til at udtrække strengen bag det, eller bruge format() som forklaret nedenfor.

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

Hvis du ønsker at konvertere det til en decimalstreng, kan du bruge str().

print(str(i))
# 255

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

Indbygget funktion format(), string metode str.format(), f string

Den indbyggede funktion format() og strengmetoderne str.format() og f-string kan også konvertere tal til binære, oktale og hexadecimale strenge.

Ved at angive det andet argument for format() på følgende måde kan det konverteres til henholdsvis binære, oktale og hexadecimale strenge.

  • Binært tal:b
  • oktal:o
  • Hexadecimalt tal: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'>

Hvis du ønsker at få en streng med præfikset 0b,0o,0x, skal du tilføje # til formateringsspecifikationsstrengen.

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

Det er også muligt at udfylde 0 med et vilkårligt antal cifre. Bemærk, at der også skal tages hensyn til antallet af tegn for præfikset (to tegn), når nul udfyldes med et præfiks.

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

Strengmetoden str.format() kan også bruges til konvertering.

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

Fra og med Python 3.6 kan du også bruge f-strengen.f'xxx'

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

Konverter et negativt heltal til en streng i tokomplementformat.

Når et negativt heltal konverteres til en binær eller hexadecimal streng ved hjælp af bin() eller format(), vil den absolutte værdi have et minustegn.

x = -9

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

I Python udføres bitvise operationer på negative hele tal også i tokomplementrepræsentation. Hvis du derfor ønsker at få en streng udtrykt i tokomplementform, kan du foretage en bitvis logisk OR& med det maksimale antal bitcifre, der kræves, på følgende måde.

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

Konverter strenge i binær, oktal- og hexadecimal notation til tal.

Indbygget funktion int()

Hvis du vil konvertere en streng i binær, oktal- eller hexadecimal notation til et tal, skal du bruge den indbyggede funktion int().

Med int(string, radix) kan en string str i binær, oktal, hexadecimal notation osv. konverteres til en numerisk int baseret på radix. Hvis radix udelades, anses tallet for at være 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'>

Hvis radix er indstillet til 0, foretages konverteringen på grundlag af følgende strengpræfiks.

  • Binært præfiks:0beller0B
  • oktalpræfiks:0oeller0O
  • Hexadecimalt præfiks:0xeller0X
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

Hvis grundtallet er 0, og der ikke er noget præfiks, vil det blive konverteret som et decimaltal, men bemærk, at hvis begyndelsen (venstre side) er fyldt med 0, vil der opstå en fejl.

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

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

I andre tilfælde kan strings, der er fyldt med nul, konverteres som de er.

print(int('010'))
# 10

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

Hvis strengen ikke kan konverteres med den angivne radix eller det angivne præfiks, opstår der en fejl.

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

Eksempler på anvendelse

Aritmetik med binære strenge

Hvis du f.eks. vil udføre en operation på en streng i binær notation med præfikset 0b.

Du kan nemt konvertere den til en numerisk værdi (integer type int), udføre operationer på den og derefter konvertere den tilbage til en streng str igen.

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

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

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

Konverter mellem binære, oktale og hexadecimale tal

Det er også nemt at konvertere binære, oktale og hexadecimale strenge til hinanden. Når det først er konverteret til et numerisk int, kan det konverteres til en streng i et hvilket som helst format.

Udfyldning af nuller, præfiksering osv. kan styres ved hjælp af specifikationsstrengen for formatering.

a_0b = '0b1110001010011'

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

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