Kody binarne


Podrozdziały   Tematy pokrewne

 

Jednostki binarne

Maszyna różnicowa Charlesa Babbage'a
Maszyna różnicowa C. Babbage'a

Historia rozwoju komputerów pokazuje nam, iż system binarny nie został od razu wybrany jako podstawowy system reprezentacji liczb w maszynach cyfrowych. Początkowo konstruktorzy próbowali stosować system dziesiętny, ponieważ był im najbliższy i bardziej zrozumiały. Jednakże system ten sprawia wiele kłopotów. Przede wszystkim operuje dziesięcioma symbolami, które należy w jakiś sposób reprezentować w maszynie cyfrowej. Prosta tabliczka dodawania czy mnożenia zawiera sto pozycji. Wszystko to znacznie komplikuje budowę komputera oraz wykonywanie obliczeń.

W latach czterdziestych XX wieku opracowywano teoretyczne podstawy działania maszyn cyfrowych i zwrócono uwagę na system binarny (dwójkowy) (przeczytaj również opracowania o Konradzie Zuse oraz jego komputerach). System ten posiada dwie cyfry - 0 i 1, które w prosty sposób można reprezentować w maszynie cyfrowej za pomocą odpowiednich napięć czy prądów elektrycznych. Układy realizujące operacje na cyfrach binarnych są nieporównywalnie prostsze od analogicznych układów operujących na cyfrach dziesiętnych. Te zalety systemu binarnego przyczyniły się do wybrania go za podstawowy system reprezentacji informacji we współczesnych komputerach.

 

Bit - podstawowa jednostka informacji

Claude Shannon
Claude Shannon

Słówko bit po raz pierwszy pojawiło się w literaturze informatycznej w roku 1948 w pracach znanego teoretyka informatyki Claude'a Shannona, który przyznał, iż zapożyczył ten termin od naukowca Johna Turkey'a (uważa się, iż termin software również wymyślił John). Bit powstał w trakcie drugiego śniadania, gdy John obmyślał zgrabne terminy dla pojęcia cyfry dwójkowej (binary digit):

 

bit - binary digit,     binit - binary digit,   bigit - binary digit  

 

Jak wiemy, terminy binit oraz bigit nie przyjęły się i pozostało krótkie bit. Zatem bit oznacza po prostu cyfrę binarną 0 lub 1. Cóż, trudno o coś bardziej prostego, lecz co nam to daje? W jaki sposób przy pomocy bitów można kodować informację?

Po pierwsze musimy sobie uświadomić, czym tak naprawdę jest informacja. Jest to twór abstrakcyjny, niematerialny (jeśli nie wierzysz, to odpowiedz, ile waży informacja, jaka jest w dotyku, jaki ma kolor, jak smakuje?). Przy komunikacji nie mamy bezpośrednio do czynienia z informacją, lecz z symbolami, którym tę informację przypisujemy. Dla przykładu weźmy język polski. Słowo "samolot" jest tylko ciągiem odpowiednio ze sobą połączonych dźwięków, którym nadaliśmy określone znaczenie. Również pismo to zbiór znaków, linii, które odpowiednio odczytujemy (interpretujemy przypisaną im informację).

Zatem informacja zawarta jest w symbolach - kojarzymy informację z odpowiednimi symbolami takimi jak słowa, pismo, gesty, znaki umowne (wg teorii Shannona z informacją mamy do czynienia zawsze wtedy, gdy występuje przepływ energii od nadawcy do odbiorcy - jest to definicja najbardziej ogólna). Wynika stąd wniosek, iż do przekazywania informacji potrzebujemy symboli - nośników informacji. Takim symbolem może być bit.

Bit przyjmuje dwie postacie, które (również umownie) oznaczamy odpowiednio cyfrą 0 i 1. Wyobraźmy sobie, iż cyfra 0 jest jednym symbolem, a cyfra 1 drugim (bo w rzeczywistości tak jest). Posiadamy zatem dwa symbole, którym możemy nadać dowolne, pożądane znaczenie. Jeden bit pozwoli nam przekazać informację o dwóch różnych zdarzeniach.

 

Przykład:

W pokoju hotelowym zainstalowany jest czujnik pożarowy. Czujnik ten łączy się z centralką za pomocą przewodu. Jeśli w pomieszczeniu jest normalna temperatura, to czujnik nie przesyła przewodem prądu. Zinterpretujmy to jako stan 0 - brak pożaru. Jeśli jednak wykryty zostanie ogień, to czujnik prześle przewodem prąd elektryczny. Zinterpretujmy to jako stan 1 - pożar. Czujnik i centralka komunikują się za pomocą informacji jednobitowej. Ich język składa się tylko z dwóch symboli:

 

0 - brak pożaru
1 - pożar

 

Na identycznej zasadzie mogą pracować inne proste urządzenia: czujnik zamkniętych okien lub drzwi, czujnik włączenia świateł w samochodzie, urządzenie włączania oświetlenia nocnego, itp.

 

Zapamiętaj:

Bit przyjmuje dwa stany: 0 i 1. Za pomocą bitu można przekazać dwie różne informacje przypisując je odpowiednio stanowi 0 i 1

 

Grupa bitów - kod binarny

Lp. b4 b3 b2 b1
1. 0 0 0 0
2. 0 0 0 1
3. 0 0 1 0
4. 0 0 1 1
5. 0 1 0 0
6. 0 1 0 1
7. 0 1 1 0
8. 0 1 1 1
9. 1 0 0 0
10. 1 0 0 1
11. 1 0 1 0
12. 1 0 1 1
13. 1 1 0 0
14. 1 1 0 1
15. 1 1 1 0
16. 1 1 1 1

Jeden bit to za mało, aby efektywnie kodować informację. Na szczęście możemy sobie w prosty sposób poradzić łącząc bity w grupy. Grupę taką traktujemy jak jeden symbol złożony. Poniższa tabelka przedstawia wszystkie symbole 1, 2, 3 i 4 bitowe:

Jeśli słowo binarne złożone jest z jednego bitu, to można z niego zbudować tylko dwa symbole 0 i 1 (kolor różowy w tablicy).

Dwa bity dają nam już cztery różne symbole (kolor zielony): 00, 01, 10 i 11.

Dalej trzy bity pozwalają utworzyć 8 różnych symboli (kolor niebieski), a 4 bity 16 symboli.

Zauważ, iż zwiększenie długości słowa bitowego o jeden bit podwaja liczbę możliwych do utworzenia symboli. Możemy zatem napisać:

 

Liczba
bitów
Liczba
symboli
Potęga
liczby 2
 
1 2 = 21  
2 4 = 22  
3 8 = 23  
4 16 = 24  
5 32 = 25  
6 64 = 26  
7 128 = 27  
8 256 = 28  
... ... ...  
16 65536 = 216  
... ... ...  
32 4294967296 = 232  
... ... ...  
n 2n = 2n  

 

Wynika stąd prosty wniosek: dla dowolnej skończonej ilości informacji zawsze można dobrać słówka binarne o takiej ilości bitów, aby utworzyć z nich pożądaną liczbę symboli. W ten sposób powstaje kod binarny. Teraz wystarczy otrzymanym symbolom binarnym nadać znaczenia i już możemy ich używać w ten sam sposób, co słów języka polskiego.

 

Zapamiętaj:

  • n bitów tworzy 2n różnych symboli binarnych.

  • do utworzenia n symboli binarnych, gdzie n > 1, potrzebne jest co najmniej [log2(n - 1) + 1] bitów

 

 

Zastosowania kodów binarnych

Kodowanie grafiki

Załóżmy, iż chcemy zakodować binarnie obrazek pokazany poniżej: Jest on złożony z różnokolorowych punktów, które nazywamy pikselami (z języka ang. picture element - element obrazu, punkt).

 

               
               
               
               
               
               
               
               

 

Od razu zauważamy, że punkty są tylko w czterech kolorach. Układamy tablicę kodową kolorów, w której każdemu kolorowi punktu przyporządkujemy jeden symbol dwubitowy:

 

   - 00
   - 01
   - 10
   - 11

 

Powiązaliśmy w ten sposób informację z reprezentującymi ją symbolami. Teraz wystarczy już tylko każdy piksel zastąpić symbolem dwubitowym. W tej postaci obrazek może być przechowywany w pamięci komputera, przesyłany przez sieci teleinformatyczne oraz przetwarzany.

 

00 00 00 00 00 00 00 00 0000000000000000
00 00 11 11 11 11 00 00 0000111111110000
00 11 11 11 11 11 00 00 0011111111110000
00 00 11 11 11 11 11 00 0000111111111100
00 00 00 11 11 00 00 00 0000001111000000
00 00 00 00 10 00 00 00 0000000010000000
00 00 00 00 10 00 00 00 0000000010000000
01 01 01 01 01 01 01 01 0101010101010101

 

Zwróćmy uwagę na małą czytelność dla ludzi informacji zapisanej w systemie binarnym. Szczególnie, jeśli wszystkie bity zapiszemy w jednym ciągu:

 

0000000000000000000011111111000000111111111100000000111111111100000000111100000000000000100000000101010101010101

 

Należy jednak pamiętać o tym, iż system ten jest przeznaczony dla maszyn, które nie nudzą się i nie męczą.

 

Kodowanie znaków

Zaprojektujemy kod binarny przeznaczony do kodowania małych liter alfabetu łacińskiego.

W tym przypadku wiadomościami będą literki. W alfabecie łacińskim jest ich 26: abcdefghijklmnopqrstuvwxyz. Każda literka musi być kodowana innym symbolem binarnym. Musimy określić zatem niezbędną liczbę bitów tworzących te symbole. W tym celu wykorzystujemy drugi z podanych wzorów i otrzymujemy:

 

[log2(26 - 1) + 1] = [log225 + 1] = [4,64 + 1] = [5,64] = 5 bitów

 

5 bitów tworzy 32 symbole. Nam potrzebne jest 26, zatem 6 symboli nie zostanie wykorzystanych. Od przybytku głowa nie boli. Ważne jest, aby symboli nie było mniej niż liczba wiadomości do zakodowania. Więcej w niczym nam nie przeszkadza - nawet lepiej, gdyż w przyszłości będzie można do takiego systemu dodać 6 nowych znaków (np. spacja, przecinek, kropka itp.).

W następnym kroku układamy tabelkę kodu znakowego, w której każdej literce przydzielamy jeden symbol binarny. Po tej operacji można literki przedstawiać jako symbole binarne oraz z symboli binarnych odczytywać literki. Odwzorowanie jest zatem obustronne.

 

Binarny kod znakowy
Znak Kod Znak Kod Znak Kod Znak Kod
a 00000 h 00111 o 01110 v 10101
b 00001 i 01000 p 01111 w 10110
c 00010 j 01001 q 10000 x 10111
d 00011 k 01010 r 10001 y 11000
e 00100 l 01011 s 10010 z 11001
f 00101 m 01100 t 10011  
g 00110 n 01101 u 10100

 

Wykorzystując tabelkę kodową zamieńmy na symbole binarne słowo "wagon":

 

w a g o n
10110 00000 00110 01110 01101

 

Po połączeniu bitów w jeden ciąg otrzymujemy:

 

1011000000001100111001101

 

Dla człowieka zapis ten staje się zupełnie nieczytelny, lecz komputery radzą sobie z nim znakomicie - bity to ich żywioł. Spróbujmy teraz dokonać operacji odwrotnej, tzn. odczytać słowo zakodowane w bitach, które np. otrzymaliśmy za pomocą sieci teleinformatycznej z drugiego końca świata:

 

1001101110010101100001110

 

Najpierw rozdzielamy otrzymane bity na grupy pięciobitowe:

 

10011  01110  01010  11000  01110

 

Dla każdej grupy bitów (symbolu binarnego) odszukujemy w tabelce kodu odpowiednią literkę:

 

10011 01110 01010 11000 01110
t o k y o

 

Bajt

Chociaż wolno nam tworzyć kody binarne o dowolnej liczbie bitów na symbol, to jednak z technicznego punktu widzenia wygodnie jest przyjąć pewne ustalone jednostki. Standardowe grupy bitów można w prosty sposób przechowywać w pamięciach komputerów, na nośnikach danych oraz przesyłać za pomocą sieci teleinformatycznych.

Bajt  (z ang. byte) jest taką właśnie standaryzacją. Najczęściej przyjmuje się, iż jest to grupa 8 bitów. Komórki pamięci komputera przechowują informację w postaci bajtów. Również wiele urządzeń przystosowane zostało do danych przekazywanych w takiej formie (porcjami po 8 bitów) - np. drukarki, terminale, modemy, dyski elastyczne i twarde, itp. Dlatego bajt stał się kolejną po bicie jednostką informacji. Bajt utożsamiany jest ze znakiem, literą, ponieważ używa się często 8 bitowego kodu do reprezentowania znaków (ASCII - American Standard Code for Information Interchange).

 

Zapamiętaj:

Bajt jest grupą 8 bitów. Oznaczamy go dużą literką B w odróżnieniu od bitu - b. 1B pozwala reprezentować 256 różnych informacji

 

Mnożniki binarne

W fizyce i technice stosowane są wielokrotności jednostek podstawowych. Oznaczamy je odpowiednimi przyrostkami kilo, mega, giga i tera. Podstawą tych wielokrotności jest liczba 10:

 

kilo  = 1000  = 103  
mega  = 1000000  = 106  = kilo × 1000
giga  = 1000000000  = 109  = mega × 1000
tera  = 1000000000000  = 1012   = giga × 1000

 

W systemie binarnym, ze względu na podobieństwo, zastosowano również podobne mnożniki, jednakże podstawą ich jest liczba 2, nie 10, gdyż tak jest dużo wygodniej (pod koniec tego opracowania zrozumiesz dlaczego). Starano się przy tym, aby mnożnik binarny był jak najbliższy odpowiednikowi dziesiętnemu. I tak otrzymano:

 

Kilo  = 1024  = 210  
Mega  = 1048576  = 220  = Kilo × 1024
Giga  = 1073741824  = 230  = Mega × 1024
Tera  = 1099511627776  = 240  = Giga × 1024

 

Dla odróżnienia mnożników binarnych od dziesiętnych zapisujemy je dużą literką. Jednostki binarne dzielimy na bitowe (podstawą jest bit) oraz bajtowe (podstawą jest bajt).

 

Jednostki binarne
bitowe bajtowe
b bit B bajt
Kb kilobit KB kilobajt
Mb megabit MB megabajt
Gb gigabit GB gigabajt
Tb terabit TB terabajt

 

Zapamiętaj:

Podstawą mnożników binarnych jest liczba 2, a nie 10. Więc zamiast 1000 = 103 stosujemy 1024 = 210.

 

Programy

Program generuje wszystkie słowa binarne możliwe do utworzenia z zadanej ilości bitów. Ilość bitów nie jest ograniczona, jednakże pamiętajcie, iż wygenerowanie wszystkich, długich słów binarnych może zająć sporo czasu (nawet kilka wieków!!!).

 

Efekt uruchomienia programu
 Generacja kodów binarnych
  o zadanej liczbie bitów
---------------------------
(C)2005  mgr Jerzy Wałaszek
            I LO w Tarnowie

Podaj liczbę bitów n = 3

000
001
010
011
100
101
110
111

KONIEC. Naciśnij dowolny klawisz...

 

Borland
Delphi 7.0
Personal
Edition
// Program generuje wszystkie słowa binarne
// o zadanej liczbie bitów
//-----------------------------------------
// (C)2005 mgr Jerzy Wałaszek
//                I Liceum Ogólnokształcące
//                im. K. Brodzińskiego
//                w Tarnowie
//-----------------------------------------

program bincode;

{$APPTYPE CONSOLE}

var
  s     : string;
  i,n,p : integer;
begin
  writeln(' Generacja kodow binarnych');
  writeln('  o zadanej liczbie bitow');
  writeln('---------------------------');
  writeln('(C)2005  mgr Jerzy Walaszek');
  writeln('            I LO w Tarnowie');
  writeln;
  write('Podaj liczbe bitow n = '); readln(n);
  writeln;
  if n > 0 then
  begin
    s := '';
    for i := 1 to n do s := s + '0';
    while true do
    begin
      writeln(s);
      i := length(s); p := 1;
      repeat
        if p = 1 then
          case s[i] of
            '0' : begin
                    s[i] := '1';
                    p    := 0;
                  end;
            '1' : s[i] := '0';
          end;
        dec(i);
      until (p = 0) or (i = 0);
      if p = 1 then break;
    end;
  end
  else writeln('Zla liczba bitow');
  writeln;
  writeln('Nacisnij klawisz Enter...'); readln;
end.
Borland
C++ Builder
6.0
Personal
Edition
// Program generuje wszystkie słowa binarne
// o zadanej liczbie bitów
//-----------------------------------------
// (C)2005 mgr Jerzy Wałaszek
//                I Liceum Ogólnokształcące
//                im. K. Brodzińskiego
//                w Tarnowie
//-----------------------------------------

#include <iostream>
#include <string>

using namespace std;

main()
{
  string s;
  int i,n,p;
  char z[1];

  cout << " Generacja kodow binarnych\n"
          "  o zadanej liczbie bitow\n"
          "---------------------------\n"
          "(C)2005  mgr Jerzy Walaszek\n"
          "            I LO w Tarnowie\n\n"
          "Podaj liczbe bitow n = ";
  cin >> n;
  cout << endl;
  if(n > 0)
  {
    s = "";
    for(i = 1; i <= n; i++) s += '0';
    while(true)
    {
      cout << s << endl;
      i = s.length(); p = 1;
      do
      {
        if(p)
          switch(s[i-1])
          {
            case '0' : s[i-1] = '1'; p = 0; break;
            case '1' : s[i-1] = '0'; break;
          };
        i--;
      } while(p && i);
      if(p) break;
    };
  }
  else cout << "Zla liczba bitow\n";
  cout << "\nNacisnij ENTER...\n";
  cin.getline(z,1);
  cin.getline(z,1);
}
Microsoft
Visual
Basic 2005
Express
Edition
' Program generuje wszystkie słowa binarne
' o zadanej liczbie bitów
'-----------------------------------------
' (C)2005 mgr Jerzy Wałaszek
'                I Liceum Ogólnokształcące
'                im. K. Brodzińskiego
'                w Tarnowie
'-----------------------------------------

Option Explicit On

Module Module1

  Sub Main()

    Dim s As String
    Dim i, n As Integer
    Dim p As Boolean

    Console.WriteLine(" Generacja kodów binarnych")
    Console.WriteLine("  o zadanej liczbie bitów")
    Console.WriteLine("---------------------------")
    Console.WriteLine("(C)2005  mgr Jerzy Wałaszek")
    Console.WriteLine("            I LO w Tarnowie")
    Console.WriteLine()
    Console.Write("Podaj liczbę bitów n = ") : n = Val(Console.ReadLine)
    Console.WriteLine()
    If n > 0 Then
      s = ""
      For i = 1 To n : s += "0" : Next
      Do
        Console.WriteLine(s)
        i = s.Length() : p = True
        Do
          If p Then
            If s.Chars(i - 1) = "0" Then
              Mid(s, i, 1) = "1" : p = False
            Else
              Mid(s, i, 1) = "0"
            End If
          End If
          i = i - 1
        Loop Until (Not p) Or (i = 0)
        If p Then Exit Do
      Loop
    Else
      Console.WriteLine("Zła liczba bitów")
    End If
    Console.WriteLine()
    Console.WriteLine("KONIEC. Naciśnij dowolny klawisz...")
    Console.ReadLine()

  End Sub

End Module
JavaScript
<html>
  <head>
  </head>
  <body>
    <div align="center">
<form style="BORDER-RIGHT: #ff9933 1px outset; PADDING-RIGHT: 4px;
             BORDER-TOP: #ff9933 1px outset; PADDING-LEFT: 4px;
             PADDING-BOTTOM: 1px; BORDER-LEFT: #ff9933 1px outset;
             PADDING-TOP: 1px; BORDER-BOTTOM: #ff9933 1px outset;
             BACKGROUND-COLOR: #ffcc66" name="frmbincode">
  <h3 style="text-align: center">
    Generacja kodów binarnych<br>
    o zadanej liczbie bitów
  </h3>
  <p style="TEXT-ALIGN: center">
    (C)2005 mgr Jerzy Wałaszek&nbsp;&nbsp; I LO w Tarnowie
  </p>
  <hr>
  <div align="center">
    <table border="0" cellpadding="4" style="border-collapse: collapse">
      <tr>
        <td align="right">Liczba bitów n = </td>
        <td>
<input value="3" name="inp_n" size="20" style="text-align: right">
        </td>
        <td>
<input onclick="main();" type="button" value="Generuj" name="B1">
        </td>
      </tr>
    </table>
  </div>
  <p id="out_t" style="TEXT-ALIGN: center">...</p>
</form>

<script language=javascript>

// Program generuje wszystkie słowa binarne
// o zadanej liczbie bitów
//-----------------------------------------
// (C)2005 mgr Jerzy Wałaszek
// I Liceum Ogólnokształcące
// im. K. Brodzińskiego
// w Tarnowie
//-----------------------------------------

function main()
{
  var s,t,i,n,p;

  n = parseInt(document.frmbincode.inp_n.value);
  if(!isNaN(n))
  {
    t = s = "";
    for(i = 1; i <= n; i++) s += '0';
    while(true)
    {
      t += s + " ";
      i = s.length; p = 1;
      do
      {
        if(p)
          switch(s.charAt(i-1))
          {
            case '0' : s = s.substr(0,i-1) + '1' + s.substring(i,s.length);
                       p = 0; break;
            case '1' : s = s.substr(0,i-1) + '0' + s.substring(i,s.length);
                       break;
          };
        i--;
      } while(p && i);
      if(p) break;
    };
  }
  else t = "<font color=red><b>Złe dane wejściowe</b></font>";
  document.getElementById("out_t").innerHTML = t;
}

</script>
    </div>
  </body>
</html>

 

Tutaj możesz przetestować działanie prezentowanego skryptu (nie stosuj zbyt dużych wartości dla n, gdyż może to zablokować przeglądarkę!):

Generacja kodów binarnych
o zadanej liczbie bitów

(C)2005 mgr Jerzy Wałaszek   I LO w Tarnowie
Liczba bitów n =

...

 

Zadania

Zadanie 1 (średnio łatwe)

Skoro informacja jest tworem niematerialnym, to w jaki sposób może być przetwarzana za pomocą maszyn liczących?

 

Zadanie 2 (łatwe)

Ile bitów potrzebne jest do zakodowania każdej cyfry dziesiętnej?
Odpowiedź:   

.

Odpowiedź uzasadnij.

 

Zadanie 3 (łatwe)

Jak wzrośnie liczba słówek kodowych, jeśli zwiększymy liczbę bitów o 3?
Odpowiedź: razy

.

Odpowiedź uzasadnij.

 

Zadanie 4 (łatwe)

Ile bitów zawiera 1MB?
1MB = bitów

.

 

Zadanie 5 (łatwe)

Ile bajtów zawiera 1,5GB?
1,5GB = bajtów

.

 


Zobacz dalej...

Naturalny system dwójkowy | Dwójkowy system stałoprzecinkowy | Operacje arytmetyczne w systemie dwójkowym | Operacje logiczne na bitach | Konwersje dwójkowo ósemkowe i szesnastkowe



List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2017 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.