System liczbowy to sposób jednolitego zapisu i nazewnictwa liczb. Do zapisu liczb używa się skończonego zbioru cyfr.
Na co dzień używamy systemu dziesiętnego (mamy do dyspozycji 10 cyfr: 0,1,2,3,4,5,6,7,8,9) ale w informatyce najbardziej naturalnym jest system dwójkowy, ponieważ dane są zapisywane na bitach, gdzie są tylko 2 możliwości wpisania cyfry: 0 lub 1. Oba te systemy są pozycyjne.
System pozycyjny to taki system, gdzie kolejne rzędy tworzymy przez podniesienie podstawy systemu do odpowiedniej potęgi. Np. rząd jedności w systemie 10 to 10^0, dziesiątki to 10^1 itd. Tak samo jest w każdym systemie liczbowym, więc liczba 5123 w systemie 10 to inaczej 5*10^3+1*10^2+2*10^1+3*10^0.
Konwersja z systemu 10 na 2 na przykładzie liczby 1001
Znajdujemy największą potęgę dwójki, która mieści się w liczbie w systemie dziesiętnym. W naszym przypadku to jest 2^9, bo 2^9=512, a w 2^10=1024. Wpisujemy 1.
Teraz od naszej liczby odejmujemy tą potęgę którą znaleźliśmy, w naszym przypadku jest to 2^9=512. Uzyskujemy 1001-512=489.
Kolejną potęgą mniejszą jest 2^8. Sprawdzamy czy w naszej już zmniejszonej liczbie zmieści się. W naszym przypadku tak, bo 2^8=256, więc możemy wpisać do naszej nowej liczby kolejną 1, ale po prawej stronie i otrzymujemy 11
Powtarzamy teraz 3 krok, uzyskujemy 233.
Powtarzamy teraz 4 krok. 2^7=128, czyli mieści się w naszej kolejny raz zmniejszonej liczbie, więc możemy wpisać kolejną 1 i już mamy 111
Powtarzamy krok 3, uzyskujemy 105.
Powtarzamy krok 4, 2^6=64, czyli mieści się, do naszej nowej liczby wpisujemy kolejną jedynkę i już mamy 1111.
Powtarzamy krok 3, mamy 41.
Powtarzamy krok 4, 2^5=32, mieści się w naszej liczbie, wpisujemy kolejną 1, ale pamiętamy, że kolejne cyfry dopisujemy przed tymi, które już są, czyli mamy 11111
Powtarzamy krok 3, mamy 9.
Powtarzamy krok 4, 2^4=16, i nie mieści się w naszej liczbie czyli wpisujemy 0, zamiast 1, więc uzyskujemy 111110
Powtarzamy krok 4, 2^3=8, mieści się w liczbie, czyli wpisujemy 1 i mamy 1111101
Powtarzamy krok 3, mamy 1.
Powtarzamy krok 4, 2^2=4, nie mieści się więc wpisujemy 0, nasza liczba to 11111010
Powtarzamy krok 4, 2^1=2, nie mieści się więc wpisujemy 0, nasza liczba to 111110100
Powtarzamy krok 4, 2^0=1, mieści się więc wpisujemy 1 i nasza liczba końcowa to : 1111101001
To samo można zapisać w bardzo przejrzystej tabelce:
2^9 | 2^8 | 2^7 | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 |
---|---|---|---|---|---|---|---|---|---|
512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 |
Jeśli dodamy wszystkie liczby tam, gdzie jest 1, to wyjdzie nasza liczba w systemie dziesiętnym: 1001.
Aby przeliczyć liczby z systemu dziesiętnego na inny niż dwójkowy, to postępujemy analogicznie, tylko że w innych systemach już mamy większą liczbę cyfr do dyspozycji, kolejne rzędy to potęgi podstawy naszego systemu.
Przykład:
55(10)=2001(3), bo 2*33+1*30=55
Łatwo można przeliczać liczby z systemów dwójkowy, czwórkowy, ósemkowy i szesnastkowy miedzy sobą pomijając system dziesiętny.
Z dwójkowego na czwórkowy
Dzielimy liczbę co 2 cyfry od końca
Każde dwie cyfry zapisujemy 1 w systemie czwórkowym
Zapisujemy od lewej liczbę czwórkowo
Przykład:
01101101110010(2)=1231302(4)
Sys.2 | 01 | 10 | 11 | 01 | 11 | 00 | 10 |
---|---|---|---|---|---|---|---|
Sys.4 | 1 | 2 | 3 | 1 | 3 | 0 | 2 |
Z czwórkowego na ósemkowy
Zamieniamy najpierw z czwórkowego na dwójkowy(każdą cyfrę w czwórkowym zapisujemy dwoma cyframi w dwójkowym)
Dzielimy liczbę co 3 cyfry od końca
Każde trzy cyfry zapisujemy 1 w systemie czwórkowym
Zapisujemy od lewej liczbę ósemkowo
Przykład:
12303201112(4)=6634126(8)
Sys.4 | 1 | 2 | 3 | 0 | 3 | 2 | 0 | 1 | 1 | 1 | 2 |
---|---|---|---|---|---|---|---|---|---|---|---|
Sys.2 | 01 | 10 | 11 | 00 | 11 | 10 | 00 | 01 | 01 | 01 | 10 |
Sys.2 | 0 | 110 | 110 | 011 | 100 | 001 | 010 | 110 |
---|---|---|---|---|---|---|---|---|
Sys.8 | 0 | 6 | 6 | 3 | 4 | 1 | 2 | 6 |
Długość zapisanych liczb
Największa liczba zapisana na n bitach to : 2n-1, czyli na:
4 bitach->15
3 bitach->7
2 bitach->3
Liczba bitów, która jest potrzebna do zapisania danej liczby naturalnej a to: log2(a+1):
15-> 4
31-> 5
127->7
Liczby ujemne w systemie dwójkowym
Z bitem znaku
Zapisujemy liczbę w systemie dwójkowym i przed liczbę wpisujemy znak bitu
0 -> liczba dodatnia
1 -> liczba ujemna
Czyli liczba 5 to 00101, a -5 to 10101.
Wadą tej metody jest to, że suma dwóch liczb przeciwnych nie daje 0.
00101
+10101
11010, a to jest 26.
Kod uzupełnieniowy (U2)
Dla dowolnej liczby a>0 liczba w U2=a,
Dla dowolnej liczby a<0 liczba w U2=a+2n, gdzie n to liczba bitów.
Tak więc dla a=6 i dla n=4 wygląda tak:
6 -> w U2=6=0110(2)
-6 -> w U2=-6 + 24=6+16=10=1010(2)
Algorytm na zapis liczby ujemnej w U2:
Zapisujemy liczbę dodatnią w systemie 2: 6 -> 0110
Negujemy wszystkie bity, zamiana 1 na 0 i na odwrót: 0110 -> 1001
Dodajemy 1: 1001 +1 -> 1010
Nasza końcowa liczba to : 1010
0110
+ 1010
10000 -> na 4 bitach mamy zapisane 0
Liczby rzeczywiste w systemie dwójkowym
Zapis stałoprzecinkowy jest ustalone ile bitów przeznaczamy na część całkowitą i ułamkową, nie piszemy kropki.
Przykład: 22,625(10)=10110 1100(2)gdzie 5 bitów to cz. całkowita i 4 cz. ułamkowa
2^4 | 2^3 | 2^2 | 2^1 | 2^0 | 2^-1 | 2^-2 | 2^-3 | 2^-4 |
---|---|---|---|---|---|---|---|---|
16 | 8 | 4 | 2 | 1 | $$\frac{1}{2}$$ |
$$\frac{1}{4}$$ |
$$\frac{1}{8}$$ |
$$\frac{1}{16}$$ |
1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 |
Zapis zmiennoprzecinkowy stosujemy przy bardzo małych albo bardzo dużych liczbach. Symbolicznie ten zapis można przedstawić tak(w systemie dziesiętnym): m*10C, gdzie:
m to mantysa, 0,1<=|m|<1,
c to cecha, liczba całkowita.
W systemie dwójkowym zamiast 10, będzie 2, mantysa będzie ograniczona przez 0,5 i 1. Wszystkie liczby mantysa jak i cecha będzie zapisana w systemie dwójkowym o stałej liczbie znaków.
Przykład:
0,01 * 2101= 0,25*25=0,25*16=4