Sådan Konverterer Du Mellem Talsystemer (Binært, Oktalt, Decimalt, Hex)
For at konvertere et decimaltal til en anden talbase deler du gentagne gange med basen og noterer resterne, eller trækker den størst mulige potens af basen fra igen og igen. Decimaltallet 202 bliver til 11001010 i binært, 312 i oktalt og CA i hexadecimalt, og de samme to metoder virker for et hvilket som helst heltal, uanset hvilken base du regner om til.
Hvad en talbase egentlig betyder
En talbase (også kaldet radix) fortæller, hvor mange unikke cifre et positionsbaseret talsystem har til rådighed. Decimal, base 10, bruger cifrene 0 til 9. Binært, base 2, har kun 0 og 1. Oktal, base 8, bruger 0 til 7, og hexadecimal, base 16, løber tør for cifre ved 9 og låner bogstaverne A til F til at repræsentere værdierne 10 til 15.
Det, der binder dem sammen, er positionsnotation: hver cifferposition tæller for en potens af basen. I decimaltallet 202 betyder cifferet 2 yderst til venstre 2 × 10², midtercifferet 0 betyder 0 × 10¹, og cifferet 2 yderst til højre betyder 2 × 10⁰. Lægger du dem sammen, 200 + 0 + 2, får du 202 igen. Det samme princip gælder i enhver base, bare med basens egne potenser i stedet for tiere.
Konvertering af decimal til binært, oktalt og hex i hånden
Tag decimaltallet 202 som gennemgående eksempel. Der er to metoder, der begge fører frem til samme svar, division-med-rest og en plads-værdi-metode, der er særligt praktisk til binært.
Division-med-rest går ud på at dividere gentagne gange med målbasen og skrive resten ned hver gang. Sådan bliver 202 til oktal (base 8):
| Trin | Division | Kvotient | Rest |
|---|---|---|---|
| 1 | 202 ÷ 8 | 25 | 2 |
| 2 | 25 ÷ 8 | 3 | 1 |
| 3 | 3 ÷ 8 | 0 | 3 |
Læs resterne nedefra og op, 3, 1, 2, og du får 312. Samme metode til hex (base 16):
| Trin | Division | Kvotient | Rest |
|---|---|---|---|
| 1 | 202 ÷ 16 | 12 | 10 (A) |
| 2 | 12 ÷ 16 | 0 | 12 (C) |
Nedefra og op giver det C, A, altså CA. Bemærk at resten 10 skrives som bogstavet A, og resten 12 skrives som C, fordi hexadecimal kun har enkelte cifre til rådighed og derfor bruger bogstaver for værdier fra 10 og opefter.
Plads-værdi-metoden er den hurtigste vej til binært i hånden. Du finder den største potens af 2, der stadig kan trækkes fra tallet, trækker den fra, og gentager med resten:
| Potens af 2 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|---|
| Bit sat? | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
202 − 128 = 74. 74 − 64 = 10. 10 er mindre end 32 og 16, så begge de bit er 0. 10 − 8 = 2. 2 er mindre end 4, så den bit er 0. 2 − 2 = 0. Resten er nu 0, så sidste bit er også 0. Sætter du de sat bit sammen, 128 + 64 + 8 + 2, giver det 202, og binærrepræsentationen bliver 11001010.
Som en sidegevinst er tal, der er en ren potens af 2, altid pæne på tværs af baser. 4096 (2¹²) bliver til 1000000000000 i binært, 10000 i oktalt og 1000 i hex, et enkelt etttal efterfulgt af nuller i alle tre, fordi 4096 rammer en rund grænse i hver base.
Læsning af oktal og hex tilbage til decimal (chmod-eksemplet)
Den anden vej rundt, fra en anden base til decimal, dukker op konstant hvis du arbejder med Unix-filrettigheder. Kør ls -l på en fil, og du kan få en tilladelsesværdi som 755 tilbage, oktal notation for læse-, skrive- og eksekveringsrettigheder for ejer, gruppe og andre.
For at læse 755 (oktal) som decimal ganger du hvert ciffer med den tilsvarende potens af 8, fra højre mod venstre:
| Ciffer | Position | Beregning | Værdi |
|---|---|---|---|
| 7 | 8² | 7 × 64 | 448 |
| 5 | 8¹ | 5 × 8 | 40 |
| 5 | 8⁰ | 5 × 1 | 5 |
448 + 40 + 5 = 493. Så oktal 755 er decimal 493.
Den samme værdi i binært er 111101101. Den nemmeste måde at få den frem på er en genvej, der er specifik for oktal: hvert oktalt ciffer svarer til nøjagtigt 3 bit, fordi 2³ = 8. Omsæt derfor hvert ciffer i 755 for sig, 7 = 111, 5 = 101, 5 = 101, og sæt dem sammen: 111 101 101. Ingen division nødvendig.
Hex har den samme genvej med 4 bit i stedet for 3, fordi 2⁴ = 16. Gruppér 111101101 i nibbles af 4 fra højre, med padding foran, 0001 1110 1101, og oversæt hver gruppe: 0001 = 1, 1110 = 14 (E), 1101 = 13 (D). Resultatet er 1ED, som stemmer med decimal 493. Det er præcis grunden til at hex er så udbredt i programmering: to hex-cifre dækker en hel byte (8 bit) uden rest, mens den binære udgave af samme byte kræver 8 tegn at skrive og er langt sværere at aflæse på et øjekast. Farvekoder (#RRGGBB), hukommelsesadresser og fejlkoder bruger hex af samme årsag.
Prøv med dine egne tal
Skriv et tal i et af de fire felter herunder, decimalt, binært, oktalt eller hex, og se de tre andre repræsentationer opdatere sig selv med det samme.
Almindelige fejl og specialtilfælde
Forveksler negative tal med to’s komplement. Skriv -18 i decimal-feltet, og du får -10010 i binært, -22 i oktalt og -12 i hex, et almindeligt minustegn foran den samme cifferrække som 18 ville give. Det kaldes fortegns-størrelse-repræsentation (sign-magnitude), og det er ikke det samme som to’s komplement, den metode de fleste programmeringssprog bruger internt til signerede heltal. Havde -18 været et signeret 8-bit heltal i to’s komplement, ville det stå som 11101110, et helt andet bitmønster. Går du ud fra to’s komplement, når du læser dette værktøjs output, ender du med et forkert tal, så husk at et minustegn her altid betyder fortegn plus størrelse, aldrig en komplementeret bitrække.
Ignorerer, at bogstavcifre i hex kan skrives i begge tilfælde. Du kan indtaste ca eller CA i hex-feltet, begge dele tolkes ens, men output vises altid med store bogstaver. Det er bare en visningskonvention, ikke en regel du skal huske ved indtastning.
Tror at foranstillede nuller ændrer værdien. 0202 og 202 er samme decimaltal, ligesom 011001010 og 11001010 er samme binærtal. Foranstillede nuller fylder bare pladser ud og påvirker aldrig den beregnede værdi.
Overser grænsen for meget store tal. Konverteren regner inden for JavaScripts sikre heltalsgrænse, groft sagt op til 2⁵³ − 1, omkring 9 billiarder. Det dækker langt de fleste praktiske brug, men går du ud over den grænse, mister beregningen præcision, og du bør i stedet bruge et specialiseret bibliotek til meget store heltal.
Forsøger at skrive kodepræfikser som 0x eller 0b direkte i felterne. I programmeringssprog markerer 0x en hex-literal og 0b en binær literal, men dette værktøj forventer bare de rene cifre, CA i stedet for 0xCA, 11001010 i stedet for 0b11001010. Skriver du præfikset med, bliver det tolket som en del af selve tallet, hvilket giver et forkert resultat.
Ofte stillede spørgsmål
Hvad er egentlig forskellen på en talbase og et almindeligt tal? Et tal er en abstrakt værdi, mens en talbase er den måde, tallet skrives ned på. 202, 11001010, 312 og CA er fire forskellige skriftlige repræsentationer af nøjagtig samme værdi, ligesom “ti” og “10” begge betegner det samme tal på to forskellige måder.
Hvorfor bruger programmører hex, når computere reelt kun forstår binært? Fordi hex er en menneskevenlig genvej til binært uden at miste præcision. Hvert hex-ciffer svarer nøjagtigt til 4 bit, så to hex-cifre repræsenterer altid en hel byte. At skrive FF er langt hurtigere at læse og skrive end 11111111, og oversættelsen mellem dem er mekanisk, ikke en tilnærmelse.
Hvordan konverterer jeg binært til decimal i hovedet uden en division-tabel? Læg de potenser af 2 sammen, hvor bitten er 1. For 11001010 er de sat bit fra venstre 128, 64, 8 og 2. 128 + 64 + 8 + 2 = 202. Det er samme regnestykke som plads-værdi-metoden ovenfor, bare kørt baglæns fra binært til decimal i stedet for omvendt.
Hvad er det største tal, jeg kan bruge i dette værktøj? Praktisk talt ethvert heltal, du støder på i hverdagsprogrammering. Den tekniske grænse ligger ved JavaScripts sikre heltalsgrænse, cirka 9 billiarder (2⁵³ − 1). Tal ud over det punkt risikerer at miste præcision i beregningen.
Understøtter værktøjet negative tal? Ja. Sæt et minustegn foran værdien i et hvilket som helst af de fire felter, og alle fire repræsentationer viser den negative udgave med samme fortegn. Det er sign-magnitude, ikke to’s komplement, se afsnittet om almindelige fejl ovenfor for forskellen.
Kan jeg dele værktøjet med mine tal allerede udfyldt? Ja. Webadressen opdateres automatisk, mens du skriver på selve værktøjssiden, så du kan kopiere linket fra adresselinjen eller bruge Del-knappen, og den, der åbner linket, ser præcis dine tal klar i alle fire felter.