2008-01-21

System binarny

System binarny zwany też dwójkowym, jest systemem "ojczystym" każdego dzisiejszego komputera. Najprawdopodobniej dlatego że ogranicza się do dwóch stanów, albo jest napięcie albo go nie ma. Co prawda w pierwszych komputerach próbowano używać dziesiątkowego(decymalnego/arabskiego) systemu liczbowego, ale trudna implementacja spowodowała przejście do systemu binarnego, który jest na pozór trudniejszy. Ten pozór tworzy fakt że jesteśmy przyzwyczajeni do systemu decymalnego. Dobra przejdźmy do rzeczy...

W systemie binarnym operujemy dwoma cyframi, 1 i 0, a więc mamy podstawę 2. Tego dowiedziałeś się z poprzedniej notki. Na początku przedstawię jak zamienić liczbę decymalną na binarną. Weźmy jakąś liczbę, no załóżmy mój numer GG. :) Pierw przedstawię przykład, a później go wytłumaczę.
DzialanieReszta
8738123/2=43690611
4369061/2=21845301
2184530/2=10922650
1092265/2=5461321
546132/2=2730660
273066/2=1365330
136533/2=682661
68266/2=341330
34133/2=170661
17066/2=85330
8533/2=42661
4266/2=21330
2133/2=10661
1066/2=5330
533/2=2661
266/2=1330
133/2=661
66/2=330
33/2=161
16/2=80
8/2=40
4/2=20
2/2=10
1/2=01

Teraz zapiszmy naszą resztę od dołu, tzn. wspak. Wyszło więc 100001010101010101001011b. Hmm... A więc dobra... No to tak, co zrobiliśmy?
Mieliśmy liczbę wyjściową, nazwijmy ją sobie x, miała ona wartość 8738123. Dzieliliśmy ją przez 2 dopóki x nie było równe 0, a resztę zapisywaliśmy. x miało wartość naszego ostatniego wyniku. Mam nadzieje że rozumiesz.

Teraz spróbujmy naszą pięknie długą liczbę binarną odmienić na taką, jaka była na początku. Są dwie metody które są bardzo popularne, jedna się opiera na matmie, druga jest metodą tabelkową. Pierw przedstawię metodę tabelkową. Robimy sobie tabelkę, coś takiego:
1024 512 256 128 64 32 16 8 4 2 1
Później piszemy sobie naszą liczbę binarną pod kolejnymi liczbami i uzyskujemy liczbę dziesiętną, spróbuj sam poszerzyć tą tabelkę i tym sposobem przekształcić mój nrGG z systemu binarnego na system decymalny. Ja teraz przedstawię drugą metodę, ta metoda potrzebuje więcej liczenia, ale łatwiej ją wbudować w program.
100001010101010101001011b=
1*2**0+1*2**1+0*2**2+1*2**3+0*2**4+0*2**5+1*2**6+0*2**7+1*2**8+0*2**9+
1*2**10+0*2**11+1*2**12+0*2**13+1*2**14+0*2**15+1*2**16+0*2**17+1*2**18+
0*2**19+0*2**20+0*2**21+0*2**22+1*2**23=
1*2**0+1*2**1+1*2**3+1*2**6+1*2**8+1*2**10+1*2**12+1*2**14+1*2**16+1*2**18+
1*2**23=8738123
Dobra, a więc co my tutaj zrobiliśmy? Po pierwsze odwróciliśmy znowu naszą liczbę binarną. Teraz po prostu mnożymy każdą cyfrę naszej liczby binarnej z potęgą liczby dwa o wykładniku równym numerowi pozycji od lewej strony licząc od zera. Pierw podałem liczbę binarną, później działanie zgodne z poprzednim zdaniem. Kolejnym działaniem jest tym samym działaniem tylko że wyciełem cyfry 0 liczby binarnej. Na końcu jest ofc wynik.
Dla poćwiczenia spróbuj zamienić tą metodą na liczby decymalne:
101b
1011b
101101b
10011001b
10101010b
Metodą tabelkową:
10101b
10001b
101010101b
100010001b
10000b
Oraz zamień na liczby binarne:
11
2
1993
2008
2116
9345
2012
643
352
234
101
Odpowiedzi zostały zakodowane za pomocą base64 którego dekoder znajdziesz tutaj.
T2Rwb3dpZWR6aSBkbyB6YWRhbmlhIDE6
DQo1DQoxMQ0KNDUNCjE1Mw0KMTcwDQ
pPZHBvd2llZHppIGRvIHphZGFuaWEgMjoN
CjIxDQoxNw0KMzQxDQoyNzMNCjE2DQpP
ZHBvd2llZHppIGRvIHphZGFuaWEgMzoNCj
EwMTFiDQoxMGINCjExMTExMDAxMDAxYg
0KMTExMTEwMTEwMDBiDQoxMDAwMDEw
MDAxMDBiDQoxMDAxMDAxMDAwMDAwM
WINCjExMTExMDExMTAwYg0KMTAxMDAw
MDAxMWINCjEwMTEwMDAwMGINCjExMTA
xMDEwYg0KMTEwMDEwMWI=

2008-01-20

Bajt a bit | Zalążek systemu binarnego

Kolejna osoba napisała do mnie z pytaniem, dlaczego jej neostrada 1Mb/s ściąga tylko 128KB/s. By nie musieć tłumaczyć następnym dopytującym się o to osobą postanowiłem tej osobie odpowiedzieć na moim świeżo założonym blogu. Trzeba się nim pochwalić, nie?
Musisz wiedzieć że b to nie to samo co B. Małe b oznacza bit, a duże B to bajt. Czym się różni bajt od bitu oprócz nazwy? Wielkością. Na jeden bajt składa się 8bitów. 1bit może przybrać tylko dwie wartości, 1 lub 0. Bajt ma 256 wartości(łącznie z zerem!). Wynika to z faktu że 2**8=256. Dwie gwiazdki oznaczają potęgowanie. Teraz spójrz na jednostki. K to skrót od kilo czyli razy 1000, ale komputery liczą w systemie binarnym, przez co musisz zapamiętać by pomnożyć twoją wartość przez 1024. Dlaczego tak jest? Ponieważ mnożnik dla K to 2**10. Jeśli jest M przed jest to mega-jednostka np. megabajt, jego mnożnik to 2**20, kolejne mnożniki jednostek to giga, tera, peta, eksa, zetta, jotta. Skrótem tych mnożników jest 1 litera jej nazwy, przemieniona na dużą.
To jest nasz wstęp do obliczeń. Na początku sprowadzimy obie jednostki do takich samych. W 128KB nic nie trzeba zmieniać, za to 1Mbit trzeba pomnożyć przez 1024 by "zejść" do kilobajtów i podzielić przez 8 by zmienić bity na bajty. Uzyskaliśmy coś takiego:
1Mb=1024Kb
1024Kb/8=128KB
Dla ciekawych wytłumaczę jeszcze skąd się wzięło 2**8. Przygotuj 4 monety. Każda moneta ma 2 strony, orzełka i reszkę, są to nasze wartości. Oczywiście, możesz się jeszcze kłócić że jest krawędź, ale ona tylko Ci przysporzy liczenia, więc jej nie zauważamy. Weź jedną
monetę. Ile ona ma przyjąć wartości? Zgadza się dwie(pamiętaj że nie widzimy krawędzi). Weź jeszcze jedną. Mimo że sama moneta ma 2 wartości, 2 monety już mogą mieć 4 wartości. Weź jeszcze jedną monetę. Policz ile mogą różnych wartości wyrazić. Powinno wyjść 8(czyli 2**3). Weźmy kolejną, znowu liczymy. Powinno wyjść 16(czyli 2**4). Teraz sobie oznacz orzełka jako 1 i reszkę jako 0. Twoje monety zamieniły się w tej chwili w bity! Z pewnością nie będziesz miał problemu z ułożeniem monet w taki sposób by stworzyć wartości 0 lub 1. Problem może się pojawić dla większych wartości. Bo jak wyrazić wartość 3? Ustaw monety tak:
reszka, reszka, orzeł, reszka
Wyszło Ci 0010. To będzie 2. Teraz co zrobić by wyrazić 4? Wystarczy odwrócić reszkę. Później dla piątki odwracamy orzełki i reszkę za naszym ostatnim orzełkiem dotychczasowym orzełkiem
również odwracamy. Teraz powtarzamy ten proces dla kolejnych liczb.
  • 0000
  • 0001
  • 0010
  • 0011
  • 0100
  • 0101
  • 0110
  • 0111
  • 1000
  • 1001
  • 1010
  • 1011
  • 1100
Mam nadzieję że już wiesz skąd wziął się ten wzór. Zauważ że pierwszą wartość zajmuje nam zero. Więc najwyższą wartość jaką wyrazimy w ten sposób jest 2**licza_monet-1! To co Ci przed chwilą zaprezentowałem to system binarny. Któremu poświęcę całą następną notkę.

Przedstawienie.

Jestem młodym programistą amatorem. Jeszcze do końca nie wiem co chcę robić w życiu, ale pragnę by było to coś powiązanego z komputerami. Planuje na tym blogu zamieszczać moje artykułu na różne tematy, być może nie związane nawet z komputerami. Po prostu będę tu pisał to co mi akurat się zechcę napisać. Dlaczego akurat taka forma? Po pierwsze, tworzenie artykułów na zamkniętych forach według mnie nie ma sensu, w dodatku wiele for nie udostępnia odpowiedniego formatowania, choćby głupich tabelek. Po drugie, gdy będę chciał się dostać do jakieś pracy, na pewno pracodawca będzie chciał coś wiedzieć o swoim pracowniku, więc będzie mógł przejrzeć tego bloga, by dowiedzieć się nad czym pracowałem. Po trzecie, czasami lubię poklepać bez sensu. Po czwarte, każdy kto do mnie napiszę będzie mógł mieć jakieś spojrzenie na to jaki jestem, wiem z własnego doświadczenia, że głupio się pisze z jakimś mało znaczącym numerkiem lub adresem. Osobiście preferuję nawiązywać kontakty przez e-mail, ponieważ mogę odpowiedzieć w najdogodniejszym dla mnie momencie i w razie czego douczyć się w razie nie znajomości odpowiedzi na zadane pytania. Oczywiście zawsze można później przejść na Jabbera, tlena, ICQ, GG czy inny komunikator. Od razu zaznaczam że nie lubię GG. Wole Jabbera czy tlena. Po pierwsze, na GG atakuje spora ilość "lam". Jeszcze nigdy się nie spotkałem z "Cze! Poklikash?" na żadnym innym komunikatorze niż GG, dziwne nie? Albo łańcuszki, gdy myślisz że już wymarły, ktoś znowu musi Ci jakiś wysłać. Co dziwne, często się zdarza że dostaje łańcuszki od osób których nie masz na liście! Ale czego się spodziewać po 10 latkach którzy mają dostęp do takiego komunikatora? To GG w ogóle siebie nie szanuje. Jestem uważany za odmieńca, ponieważ nie mam konta na naszej klasie, tzn. miałem ale wykasowałem, po tym jak zrobiło się 20 znajomych których nie znałem... Nie znajdziecie mnie raczej na dziwnych serwisach które powstały tylko po to by sobie popisać, poznać drugą połówkę, nowych znajomych lub innych tego typu zjadaczy czasu. Po prostu, by popisać bez sensu, nie mam czasu. Po co szukać drugiej połowy całości? Nowi znajomi których nigdy nie spotkam raczej też się nie przydadzą, a jak się w którejś znajomej bujnę, to tylko sobie złamię serce, ponieważ uważam że związki na odległość nie mają sensu.
Dobra, starczy tego klepania, bo jutro nie będę miał o czym wam napisać, a tego co naklepałem dotychczas pewnie i tak nikt nie przeczyta.