Niedziesiątkowe systemy i liczenia i działania w tych systemach.
Niektórzy twierdza, że odkąd wynaleziono pieniądze i koło, ludzie zaczęli kręcić interesy. Każdy biznesmen tamtych czasów musiał umieć liczyć Np. upolowane mamuty, tygrysy szablozębne itp. mniejsze bądź większe rzeczy. Każdą liczbę trzeba było w jakiś sposób zapisać. Do dnia dzisiejszego wymyślono ich bardzo dużo.
Na początek porcja nieco ciężkostrawnej teorii, którą jednak trzeba jakoś przetrawić.
System liczbowy to inaczej zbiór reguł do jednolitego zapisywania liczb. Stosuje się tu pewnego rodzaju skończone zbiory znaków (cyfr), które można zestawiać ze sobą na różne sposoby otrzymując nieskończoną liczbę kombinacji.
Najpierw opowiem troszeczkę o systemach liczenia na przestrzeni wieków. Rozróżnia się dwa systemy liczbowe: pozycyjny i addytywny. W systemie addytywnym wartość przedstawionej liczby jest sumą wartości jej znaków cyfrowych. Przykładowo: notacja stosowana często przy liczeniu głosów, polegająca na rysowaniu kresek (symbolizujących 1) formujących kwadraty z jedną przekątną (symbolizujących 5). Na addytywnym systemie zapisu opierają się następujące systemy liczbowe: hieroglificzny, rzymski i alfabetyczny. Hieroglificzny system liczbowy używany był w starożytnym Egipcie.
Był to system oparty na zasadzie dziesiętnej, ale bez zera. Jedynkę przedstawiała pionowa kreska, liczbę 10 – znak przypominający literę U, liczbę 100 – spirala ze sznura, liczbę 1000 – kwiat lotosu z łodygą, liczbę 10 000 – podniesiony i nieco zgięty palec, liczbę 100 000 – żaba lub kijanka ze zwieszonym ogonem, liczbę 1000 000 – postać klęczącego człowieka z uniesionymi rękami. Liczby pisane były od prawej strony do lewej. Alfabetyczny system liczbowy, w którym liczby oznaczane są literami alfabetu stosowali starożytni Grecy. System ten oparty jest na zasadzie dziesiętnej, ale bez zera. Aby liczby odróżnić od słów stawiano nad nimi kreskę. W numeracji jońskiej do oznaczenia liczb 6, 90 i 900 stosowano dodatkowe znaki. Rzymski system liczbowy jest oparty na zasadzie piątkowej, bez zera, stąd specjalne znaki dla pięciu (V), pięćdziesięciu (L) i pięciuset (D). Liczbę przedstawiano jako uporządkowany układ znaków od największego do najmniejszego, a wartość liczby była równa sumie wartości występujących znaków. Na przykład: XV = 15 CXXVII = 127 Dla uproszczenia zapisu stosowano także odejmowanie – cyfra mniejsza poprzedzająca
większą oznacza wartość ujemną. ·Np.: zamiast IIII (ten sposób z czasem zarzucono) pisano IV, zamiast XVIIII pisano XIX, zamiast LXXXX pisano XC. Przykłady zapisu liczb w rzymskim systemie liczbowym: ·80 – LXXX 300 – CCC 444 - CDXLIV
496 – CDXCVI 888 - DCCCLXXXVIII 1986 – MCMLXXXVI.
Zaletą systemów addycyjnych jest możliwość zapisu nawet dużych liczb (pod warunkiem, że są "okrągłe") za pomocą jednego znaku, a wadą złożoność i kłopoty interpretacyjne przy "mało okrągłych" liczbach i bardzo skomplikowany sposób dokonywania za ich pomocą prostych operacji arytmetycznych, wymagający zapamiętywania długich tabel.
W pozycyjnym systemie liczbowym liczbę przedstawia się jako ciąg cyfr, przy czym wartość cyfry zależy od miejsca (pozycji), na którym się ona znajduje w tym ciągu. Obecnie najbardziej znanym i stosowanym jest dziesiętny system liczbowy. Pierwowzór dziesiętnego systemu liczbowego pojawił się w V w.n.e. w Indiach, skąd do Europy dotarł poprzez Arabów. Znane są również systemy: dwójkowy, trójkowy, piątkowy, ósemkowy itd. Zanim system dziesiątkowy stał się systemem powszechnym, różne plemiona i narody posługiwały się innymi systemami. Na przykład system dwójkowy spotykano w bardzo niedoskonałej formie- u niektórych plemion Australii i Polinezji. Układ piątkowy zaś u indiańskiego plemienia Szoszonów w Południowej Ameryce. Występował on również w języku Wedau na Nowej Gwinei. Starożytni Majowie ( I w.p.n.e.) używali układu dwudziestkowego. Obranie liczby pięć jako podstawy systemu liczenia wiąże się zapewne z liczbą palców u ręki. Palce pomagały, bowiem ludom pierwotnym w liczeniu. Ślady układu piątkowego widać w zapisie cyfr rzymskich: VI, VII, VIII to przecież 5 + 1; 5 + 2; 5 + 3; V- schematyczny rysunek ręki ( dłoni), X natomiast jest znakiem składającym się jak gdyby z dwóch piątek. Pozostałość niektórych systemów spotykamy do dnia dzisiejszego. Np.: zastosowanie systemu dwunastkowego znajdujemy w podziale roku na 12 miesięcy. Dzień i noc mają po 12 godzin. W handlu przetrwała jednostka tuzin. W miarach czasu i kąta zachował się częściowo system sześćdziesiątkowy, pochodzący od Babilończyków. Zaletą systemów pozycyjnych jest ich klarowność, łatwość dokonywania nawet złożonych operacji arytmetycznych, oraz możliwość zapisu dowolnie dużej liczby, jednak do zapisu bardzo dużych liczb (nawet okrągłych) jest potrzebna duża liczba cyfr.
Najprostszym i najprymitywniejszym systemem jest jedynkowy system liczbowy. Występuje w nim tylko jeden znak Np. 1. Każdą liczbę tworzy się przez powtarzanie danego znaku Np. liczbę 4 przedstawimy jako 1111, 6 odpowie 111111. Tym systemem posługują się m.in. Pigmeje.
Jak zapewne wiesz, komputer posługuje się systemem dwójkowym, czyli binarnym.
Do zapisywania wszelkich informacji używa, więc tylko dwóch cyfr: 0 (zero)i 1 (jeden). Jak w każdym pozycyjnym systemie liczbowym, liczby zapisuje się tu jako ciąg cyfr, z których każda jest mnożnikiem kolejnej potęgi liczby stanowiącej podstawę systemu.
Np. liczba zapisana w dziesiętnym systemie liczbowym jako 10, w systemie dwójkowym przybiera postać 10102, gdyż:
1x23 + 0x22 + 1x21 + 0x20 = 8+2 = 10.
Liczby w systemach niedziesiętnych oznacza się czasami indeksem dolnym zapisanym w systemie dziesiętnym, a oznaczającym podstawę pozycji danego systemu. W celu podkreślenia, że liczba jest dziesiętna można również napisać obok niej indeks. Np. 101012 = 2110Zanim dokładniej omówimy sobie ten system przenieśmy się na chwilę do przeszłości, aby zrozumieć, dlaczego właśnie taki, a nie inny jest podstawą informatyki.
Dawno, dawno temu odkryto elektryczność i zaczęto budować różne urządzenia. Prąd płynął sobie w przewodach – raz to mniejszy, innym razem większy – przenosząc sygnały radiowe, dźwiękowe czy obraz telewizyjny.
Aż tu nagle stanęło przed maszynami trudne zadanie wykonywania obliczeń. Szybko okazało się, że w matematyce nie może być (tak jak jest Np. w radiu) żadnych szumów ani trzasków. Liczby są liczbami i muszą pozostać dokładne.
Dlatego ktoś kiedyś wpadł na genialny pomysł, by w każdej chwili w przewodzie mógł być przenoszony tylko jeden z dwóch możliwych stanów: prąd nie płynie albo płynie pewien z góry ustalony, nie ma napięcia albo jest pewne określone napięcie, napięcie jest dodatnie albo ujemne itp. Te dwa stany można reprezentować przez dwie cyfry systemu binarnego: 0 oraz 1. (w taki m.in. sposób powstały urządzenia cyfrowe). Często dopiero zmiana stanu jest informacją. Np. podczas budowy elektronicznych urządzeń cyfrowych można przyjąć taki kod, że stan identyczny z poprzednim oznacz 0, a stan odwrotny do poprzedniego: 1. Można byłoby sobie zadać pytanie:, Co jest takiego fajnego w ograniczeniu się do dwóch znaków i dlaczego wybrano dwa a nie Np., 5 czy 35? Oto dwie najistotniejsze cechy urządzeń cyfrowych:
Prostota – elementy wykonujące operacje numeryczne na dwóch możliwych stanach budować jest najprościej.
Wierność kopii – przesyłanie oraz kopiowanie danych nie powoduje utraty jakości (w przypadku sygnałów, Np. dźwięku) ani dokładności (w przypadku liczb).
Wiemy, że można wymyślać dowolny system zapisu liczb. Skoro tak, to, dlaczego nie mógłby powstać system dwójkowy, jak napisałam na początku, składający się z dwóch cyfr: 0 (zera) i 1 (jeden). Działa on podobnie jak inne systemy. Weźmy na przykład kilka pierwszych liczb naszego systemu dziesiętnego. Będziemy je konwertować na system dwójkowy, zwany również binarnym. Pierwsza liczba w naszym systemie to 0 (zero). W systemie dwójkowym, liczba ta również jest równa 0, gdyż istnieje tam taka cyfra. Kolejna liczba to 1 (jeden). W systemie dwójkowym, również taka cyfra istnieje, więc zapisujemy 1. Kolejna liczba to 2 (dwa). Wiemy, że nie istnieje tam taka cyfra, więc dodajemy kolejną pozycję, a pozycję wysuniętą na prawo, zerujemy. Zatem liczba 2 w systemie dziesiętnym ma postać „10” w systemie dwójkowym. Bynajmniej nie jest to „dziesięć” tylko „jeden, zero”. Kolejne liczby w systemie dziesiętnym to: 3, 4, 5, 6, 7, 8, 9 itd. W systemie dwójkowym wyglądają one odpowiednio: 11, 100, 101, 110, 111, 1000, 1001. Jak widzimy, zasada jest cały czas taka sama. Po co komputerowi taki system? No, więc, jak zapewne wszyscy wiedzą, komputer składa się z części elektronicznych. Wymiana informacji polega na odpowiednim przesyłaniem sygnałów. Podstawą elektroniki jest prąd elektryczny, który w układach elektronicznych albo płynie albo nie. Zatem, aby łatwiej było komputerowi rozpoznawać sygnały, interpretuje on płynący prąd jako „1” (jeden), a jego brak jako „0” (zero). Nie trudno się domyślić, że komputer operując odpowiednim ustawieniem, kiedy ma płynąc prąd, a kiedy nie ustawia różne wartości zer i jedynek. Procesor konwertuje je na liczby i w ten sposób powstają czytelne dla nas obrazy, teksty, dźwięk itd. Mam nadzieję, że w ten „chłopski” sposób wyjaśniłam wam mniej więcej jak to się odbywa. Nie tylko w postaci sygnałów elektrycznych reprezentowane mogą być zera lub jedynki. Również na wszelkich nośnikach, Np. płyta CD, na której nagrywarka wypala malutkie wgłębienia. Właśnie te wgłębienia są jedynkami, a „równiny” zerami (albo i odwrotnie). Zatem, mniej więcej wiesz już jak to się odbywa. Najmniejsza jednostka pamięci, jaka jest stosowana w informatyce to 1 bit. Bit może przyjąć tylko 2 wartości: „0” lub „1, co dla komputera znaczy
odpowiednio Np. prąd nie płynie / prąd płynie albo na dysku CD: jest wgłębienie / nie ma wgłębienia. Właśnie taki najmniejsza jednostka, która może przyjmować tylko 2 wartości (jedną albo drugą) nazywana jest bitem. Bit jest oczywiście zbyt małą jednostką, aby móc być dobrym nośnikiem informacji, gdyż, co to za jednostka, która może reprezentować jedną z dwóch cyfr lub liter. Właśnie, dlatego, powstał bajt. Bajt jest najmniejszą jednostką, w której można coś zachować. Składa się on z ośmiu bitów. Zatem, wynika z tego, że może przyjąć jedną z 256 różnych wartości, (dlatego, że osiem bitów może przyjąć 256 różnych kombinacji zer i jedynek). Zatem, wynika z tego, że każda litera, cyfra czy też znak na klawiaturze ma swój numer, który mieści się między 0 a 256. I tak właśnie jest. Wszystkie numery i odpowiadające nim znaki są opisane w specjalnej, międzynarodowej tablicy nazywanej ASCII. Dla przykładu, wielkie litery alfabetu mieszczą się między 65 a 90 numerem. Gdybyśmy natomiast chcieli, aby znak reprezentowany był nie przez 1, a przez 2 bajty (16 bitów) to można by było wymyślić 65536 różnych znaków, gdyż tyle kombinacji zer i jedynek można zastosować przy 16 bitach. Zatem podsumujmy: komputer zna tylko zera i jedynki. Bity przyjmują tylko jedną z tych dwóch wartości. Osiem bitów to jeden bajt. Ustawienie ośmiu bitów decyduje o numerze, który może przyjąć maksymalnie 256. Numer decyduje o znaku, jaki komputer ma wykorzystać.
W całej swej „fajności” system binarny ma jedną wielką wadę, którą z całą pewnością zdążyliście już zauważyć. Mianowicie liczby w tym systemie są po prostu długie. Do zapisania każdej liczby potrzeba wielu cyfr – dużo więcej, niż w systemach o większej podstawie. W sumie nie ma w tym niczego dziwnego – w końcu to jest system o jednej z najmniejszej możliwej podstawie. Czy nie da się jednak czegoś na to poradzić? Odpowiedź jest jedna: należy wymyślić nowe systemy liczenia Np. ósemkowy (oktalny) szesnastkowy, (heksadecymalny), które teraz zamierzam opisać. Na pewno wielu z Was zastanawia się:, Dlaczego właśnie one są takie ważne? Nietrudno zauważyć, że 8 i 16 to odpowiednio trzecia i czwarta potęga dwójki. Co z tego wynika? Okazuje się, że każdym trzem cyfrom systemu binarnego odpowiada jedna cyfra systemu ósemkowego, a każdym czterem cyfrom systemu binarnego odpowiada jedna cyfra systemu szesnastkowego. System dziesiętny i większość pozostałych nie posiadają tej cennej właściwości. Zapewne, dlatego, że ich podstawy nie są potęgami dwójki.
Dzięki temu można sporządzić tabelkę wszystkich cyfr danego systemu i ich binarnych odpowiedników oraz używać jej do prostej zamiany dowolnie długich liczb! Utworzenie takiej tabelki z pewnością nie sprawiłoby Wam problemu. Oto ona:
0 0000 8 1000
1 0001 9 1001
2 0010 A 1010
3 0011 B 1011
4 0100 C 1100
5 0101 D 1101
6 0110 E 1110
7 0111 F 1111
Binarne odpowiedniki cyfr szesnastkowych.
Możemy teraz przeliczyć liczbę 00110101 na system szesnastkowy. W tym celu grupujemy cyfry po cztery, a następnie korzystając z tabelki zamieniamy je na cyfry szesnastkowe.
00110101 = 0111 0101 = (75)16
A teraz odwrotnie:
(ABCD)16 = 1010 1011 1100 1101 = 1010101111001101
Bardzo proste! Rodzi się tylko jednak pytanie: czy musisz tą tabelkę znać na pamięć?
W zasadzie wypadałoby znać, ale w rzeczywistości nie trzeba jej wkuwać.
Ósemkowy system liczbowy to pozycyjny system liczbowy o podstawie 8. System ósemkowy jest czasem nazywany oktalnym od angielskiego słowa octal. Do zapisu liczb używa się w nim ośmiu cyfr, od 0 do 7.Jak w każdym pozycyjnym systemie liczbowym, liczby zapisuje się tu jako ciągi cyfr, z których każda jest mnożnikiem kolejnej potęgi liczby będącej podstawą systemu, Np. liczba zapisana w dziesiętnym systemie liczbowym jako 100, w ósemkowym przybiera postać 144, gdyż: 1x82 + 4x81 + 4x80 = 64 + 32 + 4 = 100.
Z czasem nabędziesz wprawy i większość operacji wykonasz zawsze w pamięci. Pomoże w tym pamiętanie wag kolejnych cyfr w systemie binarnym. Oczywiście – znajomość na pamięć kolejnych potęg dwójki jest obowiązkowa dla każdego programisty!!!
Oto najważniejsze z nich (tych większych nie musisz wkuwać, ale przynajmniej się z nimi „opatrz” =)
1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192 itd.
215 = 32 768 (ok. trzydzieści dwa tysiące)
216 = 65 536 (ok. sześćdziesiąt pięć tysięcy)
231 = 2 147 483 648 (ok. dwa miliardy)
232 = 4 294 967 296 (ok. cztery miliardy)
System szesnastkowy bazuje na 16 znakach: 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f. Liczba w tym systemie jest zapisana jako suma kolejnych potęg liczby 16. Oto przykład zamiany liczby szesnastkowej na dziesiętną:
9ac3( 16)·=·9*163+10*162+12*161+3*160
=
36864+2560+192+3
=
39619( 10)1b( 16)·=·1*161+11*160·=·16+11 ·=·27( 10)
System szesnastkowy stosowany jest często jako skrócona forma zapisu liczb binarnych. Każdy znak systemu szesnastkowego reprezentuje 4 bitową grupę z systemu dwójkowego.
liczbadziesiętna liczbadwójkowa liczbaszesnastkowa
0 0000 0
1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
10 1010 a
11 1011 b
12 1100 c
13 1101 d
14 1110 e
15 1111 f
Jeden bajt danych można przedstawić za pomocą dwóch znaków systemu szesnastkowego:·(0 - 255( 10)) - (00000000 - 11111111( 2)) - (00 - ff( 16))·Za pomocą liczb heksadecymalnych można w prosty sposób zapisywać długie liczby binarne. Grupa 4 bitów może być zapisana za pomocą jednej cyfry heksadecymalnej zgodnie z następującą tabelą:
System D System B System H
0 0000 0
1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
10 1010 A
11 1011 B
12 1100 C
13 1101 D
14 1110 E
15 1111 F
Liczbę dwójkową dzielimy na grupy, każda po 4 bity począwszy od najmłodszego np.:1100110NB= 6616Przekształcenie odwrotne: 3A816= 1110101000NBJeden bajt może być przedstawiony za pomocą dwóch liczb heksadecymalnych od 0 do FF.FF16= 25510= 1111111116Na zakończenie kilka przykładów zastosowań:
Do zapisywania kolorów w Win32API i DirectX używa się liczb szesnastkowych.
Do zapisywania adresów komórek pamięci używa się liczb szesnastkowych.
Do zapisywania atrybutów plików w systemie Linux i na serwerach FTP używa się liczb ósemkowych.
…oraz wymienię kilka ważnych wartości dla 8-cyfrowych liczb binarnych, a także ich odpowiedniki dziesiętne i szesnastkowe (także wypadałoby się ich nauczyć :/)
00000000 = (00)16 = 0
01000000 = (40)16 = 64
01111111 = (7F)16 = 127
10000000 = (80)16 = 128
11000000 = (C0)16 = 192
11111111 = (FF)16 = 256
Artykuł ten był w szczególności dla tych wszystkich, którzy mają problemy ze zrozumieniem systemów liczbowych. Dodam jeszcze, że żaden haker, programista czy "chociażby" informatyk, nie zajdzie daleko bez powyższej wiedzy. Powiem nawet więcej: jest to podstawa dobrego komputerowca. Bez tego nie ma, co uczyć się języków programowania. Mam nadzieję, że po przeczytaniu mojej pracy każdy z Was chociażby w połowie zrozumiał, na czym polegają opisane przeze mnie systemy liczbowe.