Binär

Från Unix.se, den fria unixresursen.

Introduktion

Den binära talbasen består av 0 och 1. Genom att använda den binära talbasen kan datorer förmedla all information väldigt enkelt; tänk tillexempel om datorn för varje siffra den skulle representera hade 10 spänningsnivåer för att visa talen 0-9. Att generera dem väldigt exakt och sedan kunna läsa av dem i andra änden skulle bli en hel vetenskap. Tänk bara på de olika förlusterna i olika långa trådar, hur billig hårdvara ligger lite fel i spänningen, osv. Här är det enklare men klara svar. 0 eller 1, nej eller ja, -5 volt eller +5 volt.

Så hur funkar detta? Har någon någon gång bestämt att 145 ska betecknas som 10010001, eller finns det något logiskt bakom det hela?

Självklart gör det det. Datorer handlar bara om matematik, och det finns många smidiga algoritmer för att beräkna detta från och till andra talbaser.

Teori

Vi börjar teorin med en jämförelse. I det decimala talsystemet som vi människor använder till vardags har varje deltal ett värde från 0 till 9. I talet 412 har vi till exempel deltalen 4, 1, och 2. När de står för sig är de inte värda mer än just 4, 1 och 2, men när vi sätter ihop dem till 412 får de helt plötsligt ett högre värde. Vi kan representera detta genom att tilldela även platserna de står på värden. När vi sedan multiplicerar siffrans värde med platsens värde och summerar dessa produkter får vi talets värde. Så här blir formeln: <math>4 * 100 + 1 * 10 + 2 * 1 = 412</math>. Just siffrornas enskiljda värde känner vi till sedan vi var små, men vi anar också ett mönster i platsernas värde; 100, 10 och 1. Här har vi fått tre tal med samma värden som <math>10^2</math>, <math>10^1</math>, samt <math>10^0</math>. Vi kan alltså skriva om vår formel enligt <math>4 * 10^2 + 1 * 10^1 + 2 * 10^0</math>.

Vi har nu bara en koppling kvar, och det är att vi använder oss av det DECImala talsystemet. "Deci" betyder 10, och "bi" betyder 2. Om vi tar 10010001 från förra exemplet och skriver det på en liknande form, förkortar bort allt med <math>0 * x</math> så borde vi få 145 om folk någon gång tänkt till. <math>2^7 * 1 + 2^6 * 0 + 2^5 * 0 + 2^4 * 1 + 2^3 * 0 + 2^2 * 0 + 2^1 * 0 + 2^0 * 1 = 2^7 * 1 + 2^4 * 1 + 2^0 * 1 = 128 * 1 + 16 * 1 + 1 * 1 = 128 + 16 + 1 = 145</math>. Vi har just hittat logiken bakom samtliga befintliga talsystem, såsom det hexadecimala, oktala, binära, och så vidare.

Praktik

Så, normala människor förväntar sig sällan knappa in något annat än decimala tal i en dator. Hur sköter vi konverteringen? Den enklaste algoritmen är som följer:

Är talet udda? (tal [modulus] 2) Skriv ut en etta längst till vänster om det är det, och en 0:a annars. Heltalsdividera talet med två, och börja om. Avbryt när talet är 0.

Exempel:
(145) 1
(72) 01
(36) 001
(18) 0001
(9) 10001
(4) 010001
(2) 0010001
(1) 10010001
(0) klart! 10010001

Väldigt enkel och snabb algoritm.

Personliga verktyg