talsystem.xml

Denna kod är public domain. Om ni hittar fel eller vill ändra något i koden blir jag jätteglad om ni skickar dessa ändringar till jesper [at] fantasi [punkt] se.


<?xml version="1.0"?>
<article category="software" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="article.xsd">
  <keyword>Talsystem</keyword>
  <keyword>Binära tal</keyword>
  <keyword>Hexadecimala tal</keyword>
  <topic>Talsystem</topic>
  <ingress>
    De siffror och tal vi använder i vardagen brukar kallas decimala.
    Namnet kommer från latinets deci som betyder tio. Tio är just
    antalet siffror som vi kan använda för att skriva olika tal. Att
    det är just tio är en ren slump och hänger samman med antalet
    fingrar de flesta av oss har. I historien finner man flera
    kulturer som har valt att räkna på andra sätt. Maya-indianerna
    till exempel hade tjugo olika siffror och i Babylonien räknade man
    med basen sextio.
  </ingress>

  <subtopic>Decimala tal</subtopic>
  <text>
    Det här med att vi har tio siffror brukar kallas att vi har basen
    tio. I praktiken innebär detta att vi har de tio siffersymbolerna
    0, 1, 2, 3, 4, 5, 6, 7, 8 och 9. Dessa använder vi för att skriva
    olika tal, som till exempel 4711. Talet 4711 består av fyra
    siffror. Dessa fyra siffrors placerig är av betydelse för hur
    talet utläses och hur mycket värdet av talet är. Skulle vi till
    exempel byta plats på siffrorna och istället skriva 7141 så skulle
    det bli ett annat tal med ett annat värde. Detta beror på att
    själva platsen som siffran står på har ett värde i sig. Sjuan i
    4711 är inte bara en sjua. Platsen den står på gör att den i
    själva verket är värd 700.
  </text>
  <text>
    Man brukar prata om ental, tiotal, hunratal och så vidare och i
    det decimala talsystemet skriver man entalen längst till höger.
    Närmast till vänster kommer tiotalen och så vidare. För varje
    position åt vänster man går multipliceras platsens värde med tio.
    Ettan i talet 100 är värd tio gånger mer än ettan i talet 10.
    Detta kan låta trivialt men det är viktigt att ha dessa
    fundamentala grunder klara för sig för att förstå hur de andra
    talsystemen fungerar. Det är dessutom ingen självklarhet att det
    ska vara på det sättet. I den gamla egyptiska matematiken hade
    symbolernas position ingen betydelse, lika så i rommerska tal.
  </text>

  <subtopic>Binära tal</subtopic>
  <text>
    I en dator är allt ettor och nollor brukar man säga. Detta beror
    på att man i datorsammanhang, eller egentligen främst inom
    elektroniken, använder sig av det binära talsystemet. I det binära
    talsystemet är basen 2, man har alltså endast två siffror, 0 och
    1. En siffra i ett binärt tal brukar kallas för en bit och
    representerar den minsta enhet som kan lagra någon information.
    Precis som i det decimala talsystemet så sätter man den minst
    värda siffran längst till höger och den mest värda längst till
    vänster. Dessa brukar kallas LSB (Least Significant Bit - Den
    minst värda biten) och MSB (Most Significant Bit).
  </text>
  <text>
    Att basen är två innebär att för varje steg åt vänster man går i
    ett binärt tal så multipliceras bitens värde med två. Positionen
    längst till höger (LSB) är värd 1, positionen till vänster om
    denna är värd 2. Fortsätter man åt vänster så dubblas värdet för
    varje position, 4, 8, 16, 32 och så vidare. Ettan i det binära
    talet 100 är alltså värd två gånger mer än ettan i det binära
    talet 10.
  </text>
  <text>
    När man vill räkna om ett binärt tal till ett decimalt tal så gör
    man på exakt samma sätt som när man räknar ut värdet av ett
    decimalt tal. Värdet av det decimala talet 42 är
    4*10<nbsp/>+<nbsp/>2*1<nbsp/>=<nbsp/>42 därför att tvåans position är
    värd ett och fyrans position är värd tio gånger mer (då basen är
    tio). Motsvarande binära tal skulle bli 101010 eftersom 1*32 +
    0*16 + 1*8 + 0*4 + 1*2 + 0*1 = 42. Tabellen nedan visar några
    godtyckliga binära tal.
  </text>

  <table inner="true" start="-1" header="Positionens värde-+- "
         style="S6Cc-+-c-+-c-+-c-+-c-+-c-+-c">
    <header data="32-+-16-+- 8 -+- 4 -+- 2 -+- 1 -+-Decimalt"/>
    <row data="1-+-0-+-1-+-1-+-1-+-1-+-47"/>
    <row data="0-+-0-+-1-+-0-+-1-+-1-+-11"/>
    <row data="0-+-1-+-0-+-0-+-0-+-1-+-17"/>
  </table>

  <text>
    Det binära talsystemet saknar det minustecken som finns i det
    decimala talsystemet för att tala om att ett tal är negativt. I
    stället använder man sig av något som kallas tvåkomplement. I kort
    kan man beskriva det som att man räknar baklänges från 0. -1 blir
    då talet där alla bitar är 1. För att skilja på positiva och
    negativa tal säger man att alla tal där MSB är ett ska vara
    negativa. Om vi begränsar oss till åtta bitar får vi alltså -1 =
    11111111. -2 blir 11111110, -3 = 11111101, -4 = 11111100 och så
    vidare ner till 10000000 som blir -128. Nästa lägre tal, 01111111,
    blir 127 - positivt eftersom MSB = 0. Med dessa åtta bitar kan vi
    alltså lagra tal från -128 till 127. Detta brukar kallas för en
    signed byte.
  </text>
  <text>
    Som ni kanske lagt märke till så handlar det enbart om heltal när
    man pratar om binära tal. Flyttal är ganska krångliga att
    representera då man saknar decimaltecknet i det binära
    talsystemet, så det går jag inte in på nu.
  </text>
  <text>
    Åtta bitar räcker inte så långt i dagens datorer, idag är det inte
    ovanligt med 32- och 64-bitars tal. Principen är exakt den samma
    för dessa tal och de blir därför väldigt stora, (vi dubblerar ju
    värdet för varje ny bit). 8 bitar ger 256 kombinationer, (0-255),
    nio bitar ger 512, tio ger 1.024 och så vidare. Sexton bitar ger
    tal från 0 till 65.535. Ett signerat 16-bitarstal kan representera
    heltal mellan -32.768 och 32.767. Fortsätter man uppåt märker man
    att talen växer fort för varje ny bit. Vid 24 bitar hamnar vi på
    tal mellan 0 och 16,8 miljoner. 32 bitar ger tal upp till 4,3
    miljarder och 64 bitarstal som vi idag hittar i nyare datorer kan
    representera tal upp till 18.446.744.073.709.551.615
    (jättestort!).
  </text>

  <subtopic>Hexadecimala tal</subtopic>
  <text>
    De hexadecimala talen är mycket vanliga när man programmerar. Till
    exempel adresser i datorns minne skrivs ofta hexadecimalt. Dessa
    har basen 16. Principerna är de samma som för de binära och
    decimala talsystemen. För att kunna använda basen 16 krävs dock 16
    siffror och för att få det har man lånat in de sex första
    bokstäverna i alfabetet. A motsvarar då det decimala talet 10, b =
    11, c = 12, d = 13, e = 14 och f = 15. Att översätta ett
    hexadecimalt tal till decimalt sker enligt samma mönster som
    tidigare: 2a = 2*16 + a*1 = 2*16 + 10*1 = 42. Det hexadecimala
    talet 2a har alltså vrdet 42 i det decimala talsystemet.
  </text>
  <text>
    För att särskilja hexadecimala tal från decimala skriver man ofta
    ett prefix framför talet. 0x är ett vanligt prefix just i
    programmeringssammanhang (0x2a), # och $ är andra vanliga prefix.
    # är inte så vanlig i programmeringsspråk men används däremot i
    HTML för att beskriva färgkoder skrivna med hexadecimala tal.
  </text>
  <text>
    En stor anledning till att just hexadecimala tal är så vanliga i
    datorsammanhang är att det är mycket enkelt att översätta mellan
    hexadecimalt och binärt. Varje siffra i ett hexadecimalt tal
    motsvaras av fyra bitar (siffror i det binära talet). Tvåan i
    talet 0x2a skrivs 10 binärt och a (tio) skrivs som 1010. Sätter
    man ihop dessa får man det binära talet 101010 = 42 decimalt.
    Ytterligare exempel ger en tydligare bild:
  </text>

  <table inner="true" header="-+-Positionens värde (för det hexadecimala talet))-+-" style="-+-S4c-+-c-+-c-+-c-+-r" start="-1">
    <header data="-+-4096-+-256-+-16-+-1-+-Talet" style="N-+-N-+-N-+-N-+-N"/>
    <row data="Hexadecimalt-+-1-+-2-+-6-+-7-+-0x1267"/>
    <row data="Binärt-+-0001-+-0010-+-0110-+-0111-+-0001 0010 0110 0111"/>
    <row data="Decimalt-+---+---+---+---+-4711"/>
  </table>

  <text>
    Precis som de binära talen så saknar hexadecimala tal ett enkelt
    sätt att skriva negativa tal och decimaltal.
  </text>

  <text>
    Nedan kan du experimentera själv och konvertera olika tal mellan
    de olika baserna. Förutom de tre baser vi diskuterat här
    konverterar programmet även till oktalt (bas åtta). Längst ner
    finns även möjligheten att skriva in en egen bas för att testa
    lite annat. Kanske testa att använda bas 60 som de gamla
    babylonierna gjorde. Det är där våra sextio minuter på en timma
    kommer ifrån.
  </text>

  <applet class="Converter" width="470" height="160"
          alt="Här skulle det vara en Java applet som konverterade mellan olika talbaser."/>
</article>