Talsystem

Introduktion

Jag tänkte skriva lite grundlägande om talsystem (framför allt då de som ofta används i datorsammanhang).

Det borde nämnas att alla positionstalsystem fungerar i princip lika.

Ett talsystem är ett sätt att med vissa bestämda symboler uttrycka en kvantitet (tal).

Det talsystem som har minst symboler är enhetstalsystemet, vilket endast har en symbol, vilken betecknar en enhet.

Om talet 3 skulle skrivas ut med det talsystemet (om symbolen för enhet var E) skulle det se ut så här:
EEE (uttryckt i enhetstalsystemet) = 3 uttryckt i decimala talsystemet.

De flesta talsystem man stöter på har dock fler än 1 symbol. Det vanligaste minsta antal symboler i ett talsystem är ett som är mycket känt i programmeringskretsar och allmänt i datorsammanhang: det binära talsystemet (med 2 symboler, 1 och 0).


Omvandling

För varje position högre man kommer i talet (nästa symbol till vänster) så inkrementerar man exponenten med 1, och man börjar alltid från 0.

Självklart kan man även gå från vänster till höger, och då dekrementera exponenten varje gång, och man börjar då istället från positionen minus ett.


Ett tal oavsett talsystem med positionsuppbyggnad för konvertering till decimala talsystemet fungerar på följande sätt:
  1.  
  2. (An * Bas^Exp-0) + (An-1 * Bas^(Exp-1)) + ... + An-m * Bas^(Exp-1) + ... + A0 * Bas^0
  3.  
  4. Man kan också skriva:
  5. (An * Bas^(Exp+n)) + (An-1 * Bas^(Exp+(n-1))) + ... + An-m * Bas^(Exp+1) + ... + A0 * Bas^0
  6.  
  7. eller
  8. (An * Bas^(pos-1) + (An-1 * Bas^(pos-1)) + An-m * Bas^(pos-1) + ... + A0 * Bas^0


Där pos står för den aktuella positionen i talet.

  1.  
  2. Alltså, för det decimala talsystemet blir det (t.ex. för talet 235):
  3. 2 * 10^2 + 3 * 10^1 + 5 * 10^0 = 235
  4.  
  5. För det hexadecimala talsystemet så ser vi alltså då att t.ex. 76B blir:
  6. 7 * 16^2 + 6 * 16^1 + 11 * 16^0 = 1899 uttryckt i basen 10.



Oktalt till decimalt

Anta att vi t.ex. vill omvandla 1234 skrivet i det oktala talsystemet (bas 8) till vårat decimala talsystem (bas 10), hur gör man då?

Om vi använder metoden där vi går från vänster till höger måste vi utföra följande operation (tydligt exempel):

Vikt: 3 2 1 0
Tal: |1|2|3|4|
Bas: 8

I ett positionssystem har varje siffra ett värde som beror direkt på vilken position den har i sekvensen. Betrakta den sista siffran i vårat oktala tal: fyran.
Den har vikten 0. Det betyder att vilken bas talet än har, så kommer det aldrig att kunna ha ett annat värde än vad som står där (eftersom a^0 = 1). Den är "värd sin egen vikt" om man så vill uttrycka sig.

Låt oss nu skrida till verket.


Pseudoalgoritm

En pseudoalgoritm för att utföra omvandligen från oktalt tal till decimalt beskrivs ungefär så här (fungerar iofs för andra baser också):
  1.  
  2. 0. tilldela det hittills funna decimaltalet 0
  3. 1. ange vikten av det första talet från höger till 0
  4.  
  5. 2. tilldela det hittills funna decimaltalet sig själv och plus det decimala värdet hos siffran multiplicerat med den aktuella basen hos talet uttryckt i viktens dignitet (alltså bas upphöjt till vikt)
  6.  
  7. 3. Inkrementera vikten
  8. 4. Hantera nästa symbol till vänster (inkrementera position)
  9. 5. Upprepa från steg 2 tills inga fler symboler finns kvar
  10.  
  11. Steg två betyder alltså tal = tal + siffra * (bas^vikt)


Testa nu omvandla talet 1234 (oktalt) till vårat decimala talsystem.

Beräkning


Redan färdig? Vad blev det? Om du räknat rätt borde det blivit 668.

Vi kan nu omvandla hur stora tal som helst från vilket talsystem vi vill till vårat decimala talsystem med basen 10. Testa själv med andra baser, t.ex. ett binärt tal 10111001 (en byte):

Basen i det binära talsystemet är 2, det finns alltså bara två symboler i detta system, nämligen 0 och 1.

Värdet hos ett sådant tal bestäms som vi nu vet av vilken position en viss siffra står på, och om den är på (1) eller av (0).

Vi testar algoritmen ovan...

  1.  
  2. tal = 0
  3. bas = 2
  4. vikt = 0
  5.  
  6. tal = tal + 1 * 2^0 = 1
  7. tal = tal + 0 * 2^1 = 0
  8. tal = tal + 0 * 2^2 = 0
  9. tal = tal + 1 * 2^3 = 8
  10. tal = tal + 1 * 2^4 = 16
  11. tal = tal + 1 * 2^5 = 32
  12. tal = tal + 0 * 2^6 = 0
  13. tal = tal + 1 * 2^7 = 128
  14. -------------------
  15. summa = 185


Nu har ni verktygen att gå från vilket talsystem som helst till bas 10.
Om man vill gå baklänges (från decimalt till annat talsystem) måste man testa potenser av den basen man skall omvandla från. Detta tar jag eller någon annan upp i en senare artikel.

Keep on coding.

Skrivet 2007-03-09
/* main */

Källa: http://blinkenlights.se/