Gå til innhold
🎄🎅❄️God Jul og Godt Nyttår fra alle oss i Diskusjon.no ×

Anbefalte innlegg

Det binære tallsystemet

 

De fleste kjenner bare til det desimale tallsystemet som er basert på 10 tall (0,1,2,3,4,5,6,7,8,9). At det er basert på 10 tall er sikkert ikke tilfeldig, vi har jo 10 fingrer (det naturlige telle redskapet). Men det kunne og vert basert på 20, hvis du rekner med tærne (kanskje de hadde sko?). Men det finnes flere tallsystemer... Det binære tallsystemet er et av disse, som er basert på to tall (0,1). Det er dette tall systemet datamaskinen din forstår. Men hvordan kan da dataen forstå ord? Det er nettopp det jeg har tenkt å lære deg i denne bruker-guiden.

 

 

Litt om bits og bytes

 

Bit - 1 eller 0

Byte - En serie av 8 bits.

Kilobinær - 1024 bytes (2^10)

Megabinær - 1024 kilobytes (2^20)

Gigabinær - 1024 megabytes (2^30)

Terabinær - 1024 gigabytes (2^40)

 

Du ser kanskje ut fra dette at maskinen tenker i en togang. Merk og at en bokstav/tegn er 1 byte, altså en serie av 8 bits (0 eller 1). Hvorfor, skal vi komme tilbake til.

 

 

Det desimale tallsystemet

 

Du lærte sikkert på skolen at i f.eks tallet 123 er det 1 hundrer, 2 tiere, og 3 enere. Det kan og skrives: 1*100 + 2*10 + 3*1 = 123. Legg merke til hvordan tallene vi multipliserer med går i en tigang. Som sagt er det dette systemet vi bruker, men ikke datamaskinen...

 

 

Det binære tallsystemet

 

I dette systemet vil 123 bli representert noe annerledes: 0*128 + 1*64 + 1*32 + 1*16 + 1*8 + 0*4 + 1*2 + 1*1 = 01111011. Legg merke til hvordan tallene vi multipliserer med går i en togang. Du ser kanskje systemet, vi ser om tallet går opp i 128, så 64, så 32 osv. Du ser og kanskje at hvis du legger sammen tallene får du 255 (hvis du rekner med 0 blir det 256 tegn), og at 2^8 = 256. Da kommer vi inn på ASCII tabellen. For å kunne gjøre disse tallene om til ord trenger vi denne, hver bokstav er representert av et tall fra det desimale tallsystemet. ASCII tabellen inneholder 256 tegn (hvis du rekner med den utvidede delen der ÆØÅ er), derfor er en byte akkurat nok til å dekke alle de 256 tegnene ;)

 

 

Hvordan gjøre binærtall om til desimal?

 

Her har vi en formel som gjelder alle tallsystem: siffer * tallsystem ^ posisjon. Så hvis vi skal gjøre 01111011 om til 123 igjen, blir det:

 

0*2^7 + 1*2^6 + 1*2^5 + 1*2^4 + 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0
= 1*64 + 1*32 + 1*16 + 1*8 + 1*2 + 1*1
= 64 + 32 + 16 + 8 + 2 + 1
= 123

 

Takk til Jaffe for denne formelen.

 

 

Eksempel

 

Helt til slutt vil jeg ta med et eksempel: La oss ta ordet "hw", og gjøre det om til binærtall. Først gjør vi bokstavene om til tall fra det desimale tallsystemet ved hjelp av ASCII tabellen, da får vi h = 104 og w = 119. Så for å gjøre tallene om til binærtall gjør vi følgende: 0*128 + 1*64 + 1*32 + 0*16 + 1*8 + 0*4 + 0*2 + 0*1 = 01101000 og 0*128 + 1*64 + 1*32 + 1*16 + 0*8 + 1*4 + 1*2 + 1*1 = 01110111, resultat 0110100001110111.

 

Binærtallet 01110011 om til 115:

0*2^7 + 1*2^6 + 1*2^5 + 1*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 1*2^0
= 1*64 + 1*32 + 1*16 + 1*2 + 1*1
= 64 + 32 + 16 + 2 + 1
= 115

 

 

Addisjon

 

Addisjon i det binære tallsystemet følger samme reglene som i det desimale tallsystemet. Når vi får en høyere verdi en det er tall i tallsystemet, skriver vi opp et minnetall. F.eks: 79 + 117 = 196

 

  1111111
 01001111
+01110101
---------
=11000100

Vi begynner helt til høyre, der har vi 1 + 1 = 2, da skriver vi opp et minne tall. Slik fortsetter det. Du ser kansje at da vi har 1 + 1 + 1 = 3, blir det 1 og et minnetall.

 

 

Subtrahering

 

Dette fungerer nesten på samme måte som addisjon.

   0 - 0 = 0
   0 - 1 = 1 (med låning)
   1 - 0 = 1
   1 - 1 = 0 

Grunnen til at 0 - 1 (med låning) blir 1, er at da du låner et tall blir det 2 (2 - 1 = 1).

 

La oss trekke 79 fra 117 (117 - 79 = 38):

     ***
 01110101
-01001111
------------
=00100110

(* markerer tall som har blitt lånt fra). Legg merke til at da nullen låner for å kunne låne til tallet til høyre, blir 1 stående igjen.

 

 

Multiplikasjon

 

Dette gjøres også som i det desimale tallsystemet. For hvert siffer i tall2 blir produktet av det sifferet i tall1 utregnet og skrevet på en ny linje, et hakk til venstre for hver gang. F.eks 10 x 11 = 110:

     00001010 (tall1)
   *00001011 (tall2)
-------------
    00001010
   00001010
  00000000
+00001010
-------------
=00001101110

 

 

Noen ord til sist

 

Om det er noe som er feil kan du godt ta det over pm eller poste så skal jeg rette det snarest, eller så er det bare å stille spørsmål om du lurer på noe. Hvis noen føler for det kan de godt poste denne andre plasser eller bruke den på en hjemmeside, så lenge ingenting blir endret og navne mitt kommer med ;)

 

Magnus Hauge Bakke

Endret av Mr. Bakke
  • Liker 2
Lenke til kommentar
Videoannonse
Annonse

Fin guide, men kanskje den passer bedre et annet sted? Dette er jo ikke nødvendigvis om programmering, selv om det uten tvil blir brukt en del spesielt i lavnivåprogarmmering.

 

Savnet også at du tok med hvordan man går andre veien, fra desimal til binær, og evt. hvordan man adderer o.l. i binær.

 

For å være helt generell kunne du vel skrevet at alle tallsystem fungerer slik:

 

(siffer * tallsystem ^ posisjon) for hvert siffer i tallet, addert med andre sifferverdier.

 

For å rekne verdien 1110 til desimal gjør vi da:

 

1*2^3 + 1*2^2 + 1*2^1 + 1*2^0

= 1*8 + 1*4 + 1*2

= 8 + 4 + 2

= 14

 

Det som er bra med denne "formelen" er at den som sagt gjelder alle tallsystem. Vi kan f.eks. rekne verdien 2A3C fra hex til desimal:

 

(Merk at heksadesimale tall har ekstra siffer fra 10 til 15 som numereres fra A til F)

 

2*16^3 + A*16^2 + 3*16^1 + C*16^0

= 2*4096 + 10*256 + 3*16 + 12*1

= 8192 + 2560 + 48 + 12

= 10812

 

Eller, vi kan oversette fra femtallsystemet, eller hvilket som helst annet tallsystem.

 

Men som sagt, fin guide :)

 

EDIT: det heter togang, ikke toggang (tog? hæ?)

Endret av Jaffe
Lenke til kommentar

Kan sikkert skrive enda en om heksdesimal, når jeg får tid. Men først må jeg lage en update på denne, legge ved noe av det Jaffe sier ;)

 

Edit:

- Retta toggang til togang :p

- Har lagt til hvordan man gjør binærtall om til "vanlige tall".

Endret av Mr. Bakke
Lenke til kommentar

Du kan jo også skrive om hvordan man går fra desimal til binær? Og muligens hvordan man adderer binære tall. Det er en enkel sak, og man følger bare de samme reglene som ved vanlig addisjon: Når man får en høyere verdi enn det er siffer i tallsystemet, skriver vi opp et minnetall:

 

CODE

1 1111

11101101 (237)

+ 11001011 (203)

= 110111000 (440)

 

Vi begynner altså lengst mot høyre, som alltid, og legger sammen 1 og 1. Da får vi 2d, som vi ikke har siffer for i totallssystemet. Da må vi sette 1 som minnetall og 0 som resultat (10b = 2d). Så tar vi neste tall som er 1, men her har vi minnetallet som må tas med, så da blir det 1 + 1 = 10b som svar også her. Slik fortsetter det helt til vi har kommet til siste siffer. Da kan vi ikke skrive minnetallet opp lenger, så da skriver vi hele resultatet. Som sagt er dette akkurat det samme som i desimaladdisjon, men i stedet for å skrive minnetall når deladdisjonen resulterer i et tall større enn 9, skriver vi minnetall når det er større enn 1.

Lenke til kommentar
Jeg har da tatt med hvordan man gjør desimal om til binær. Men kan kansje slenge på addisjon osv senere, tar sikkert med mer enn bare addisjon da ;)

8634660[/snapback]

 

Jeg kan ikke se at du beskriver hvordan man går fra desimal til binær, bare andre veien, fra binær til desimal.

Lenke til kommentar
Helt til slutt vil jeg ta med et eksempel: La oss ta ordet "hw", og gjøre det om til binærtall. Først gjør vi bokstavene om til tall fra det desimale tallsystemet ved hjelp av ASCII tabellen, da får vi h = 104 og w = 119. Så for å gjøre tallene om til binærtall gjør vi følgende: 0*128 + 1*64 + 1*32 + 0*16 + 1*8 + 0*4 + 0*2 + 0*1 = 01101000 og 0*128 + 1*64 + 1*32 + 1*16 + 0*8 + 1*4 + 1*2 + 1*1 = 01110111, resultat 0110100001110111.
I dette systemet vil 123 bli representert noe annerledes: 0*128 + 1*64 + 1*32 + 1*16 + 1*8 + 0*4 + 1*2 + 1*1 = 01111011. Legg merke til hvordan tallene vi multipliserer med går i en togang. Du ser kanskje systemet, vi ser om tallet går opp i 128, så 64, så 32 osv.

Kansje ikke så bra forklart men...

Endret av Mr. Bakke
Lenke til kommentar

Ah, såklart, slik kan du også gjøre det. Du kunne kanskje forklart det litt nærmere. Men du kan også gjøre det ved å dele tallet på 2 og ta resten som en bit etter hver divisjon:

 

123 / 2 = 61.5 | 1
61 / 2 = 30.5  | 1
30 / 2 = 15    | 0
15 / 2 = 7.5   | 1
7 / 2 = 3.5    | 1
3 / 2 = 1.5    | 1
1.5 / 2 = 0.76 | 1

 

Så ordner vi bitene i motsatt rekkefølge: 1111011

Lenke til kommentar
Gjest Slettet+142

Veldig grei guide :)

Jeg føler faktisk at jeg kan dette med binærtall etter å ha lest dette :thumbup:

Endret av Slettet+142
Lenke til kommentar

Nydelig! Det kom jo en guide på HW-forsiden for et par måneder siden, men den forsvant etter noen få timer :( Av den grunn hilser jeg denne guiden hjertelig velkommen. Ganske artig dette her.

 

Spørsmål: Dersom PC-er hadde brukt titallssystemet istedenfor hadde jo lengden på tallene blitt redusert. Ville det da gått fortere? Den vil jo samtidig ha flere ulike tall å lese, så det vil kanskje gå senere på grunn av det? Uansett regner jeg med at det ville gått seinere siden de bestemte seg for totallssystemet og ikke har gått over til titallssystemet ...

 

Goscinny ;)

Lenke til kommentar
Nydelig! Det kom jo en guide på HW-forsiden for et par måneder siden, men den forsvant etter noen få timer :( Av den grunn hilser jeg denne guiden hjertelig velkommen. Ganske artig dette her.

 

Spørsmål: Dersom PC-er hadde brukt titallssystemet istedenfor hadde jo lengden på tallene blitt redusert. Ville det da gått fortere? Den vil jo samtidig ha flere ulike tall å lese, så det vil kanskje gå senere på grunn av det? Uansett regner jeg med at det ville gått seinere siden de bestemte seg for totallssystemet og ikke har gått over til titallssystemet ...

 

Goscinny ;)

8654740[/snapback]

 

 

Svar: Kanskje men det ville vært nærmes umulig å realisere sett ut fra elektronikken bak.

0 og 1 kan ganske enkelt representeres med strøm av og strøm på. F.eks 0v og 5v. Å lage systemer som reagerer forskjellig ut fra inngangsignalet er relativt enkelt når inngangsignalet bare kan ha to verdier (0 eller 1). Skulle man hatt digitale systemer som helt ned på elektronikk stadiet arbeidet på 10-tall systemet ville man fått et problem.

 

For det første må man kunne skille mellom tallene f.eks ved at:

0 = 0V

1 = 1V

2 = 2V

Osv, men så kommer problemene når disse tallene igjen skal legges til hverandre, subtraheres osv.

Lenke til kommentar
Litt om bits og bytes

 

Bit - 1 eller 0

Byte - En serie av 8 bits.

Kilobyte - 1024 bytes (2^10)

Megabyte - 1024 kilobytes (2^20)

Gigabyte - 1024 megabytes (2^30)

Terabyte - 1024 gigabytes (2^40)

8620376[/snapback]

Dette er direkte feil (teknisk og starndard-messig), men er dessverre en svært vanlig feil. Kanskje først og fremst på grunn av at Microsoft aldri har brydd seg med å følge ekte standarder. Det har dermed oppstått en "de facto standard" eller sagt bedre på norsk: en uvane.

 

SI-standarden har sagt i over 100 år og sier fortsatt:

k = kilo = 1000 = 10^3

M = mega = 1000000 = 10^6

G = giga = 1000000000 = 10^9

T = tera = 1000000000000 = 10^12

 

Dette er ikke det samme som den binært tilpassede IEC-standarden fra 1998.

 

Slik ser IEC-standarden ut:

Ki = kilobinær = 1024 = 2^10

Mi = megabinær = 1024 kilobinær = 1048576 = 2^20

Gi = gigabinær = 1024 megabinær = 1073741824 = 2^30

Ti = terabinær = 1024 gigabinær = 1099511627776 = 2^40

 

Tabellen du oppgir er altså feil fordi den hverken følger IEC-standarden (ord og forkortelser er feil) eller SI-standarden (tallene er feile).

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...