![]() |
Wyjście Spis treści Poprzedni Następny
Autor artykułu: mgr Jerzy Wałaszek, wersja 4.1 |
©2008 mgr Jerzy Wałaszek
|
| Podrozdziały | Tematy pokrewne |
|
Kody binarne |
Zasady arytmetyki w systemie binarnym są identyczne (prawie) jak w dobrze nam znanym systemie dziesiętnym. Zaletą arytmetyki binarnej jest jej prostota, dzięki czemu można ją tanio realizować za pomocą układów elektronicznych.
Poniżej opisujemy zasady wykonywania podstawowych działań arytmetycznych wraz z odpowiednimi przykładami.
Do wykonywania dodawania niezbędna jest znajomość tabliczki dodawania, czyli wyników sumowania każdej cyfry z każdą inną. W systemie binarnym mamy tylko dwie cyfry 0 i 1, zatem tabliczka dodawania jest niezwykle prosta i składa się tylko z 4 pozycji:
| 0 + 0 = | 0 |
| 0 + 1 = | 1 |
| 1 + 0 = | 1 |
| 1 + 1 = | 10 |
Przykład:
Zsumować liczby binarne 1111001(2) oraz 10010(2).
| 1111001 | |
| + | 10010 |
| 1111001 | |
| + | 10010 |
| 1011 |
| 1 | |||||||
| 1 | 1 | 1 | 1 | 0 | 0 | 1 | |
| + | 1 | 0 | 0 | 1 | 0 | ||
| 0 | 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | |||||
| 1 | 1 | 1 | 1 | 0 | 0 | 1 | |
| + | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
| 0 | 0 | 0 | 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | ||||||
| 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | |
| + | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
| 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 |
1111001(2) + 10010(2) = 10001011(2) (121 + 18 = 139)
Oto kilka dalszych przykładów:
|
|
|
Uwaga, pułapka:W pamięci komputera liczby binarne przechowywane są w postaci ustalonej ilości bitów (np. 8, 16, 32 bity). Jeśli wynik sumowania np. dwóch liczb 8 bitowych jest większy niż 8 bitów, to najstarszy bit (dziewiąty bit) zostanie utracony. Sytuacja taka nazywa się nadmiarem (ang. overflow) i występuje zawsze, gdy wynik operacji arytmetycznej jest większy niż górny zakres danego formatu liczb binarnych (np. dla 8 bitów wynik większy od 28 - 1, czyli większy od 255):
11111111(2) + 00000001(2) = 1|00000000(2) (255 + 1 = 0)
Przy nadmiarze otrzymany wynik jest zawsze błędny, dlatego należy bardzo dokładnie analizować problem obliczeniowy i ustalić typy danych zgodnie z przewidywanym zakresem wartości otrzymywanych wyników. Zwykle kompilatory języków programowania posiadają opcję włączenia sprawdzania zakresów wyników operacji arytmetycznych na liczbach całkowitych (w Dev-Pascalu jest to opcja menu Options/Compiler Options, a w okienku opcji na zakładce Code generation/Optimization zaznaczamy Check overflow of integer operations). Opcję tę włączamy w fazie testowania programu. Natomiast w gotowym produkcie należy ją wyłączyć, ponieważ wydłuża czas wykonywania operacji arytmetycznych.
|
Przy odejmowaniu korzystamy z tabliczki odejmowania, która w systemie binarnym jest bardzo prosta:
| 0 - 0 = | 0 |
| 0 - 1 = | 1 i pożyczka do następnej pozycji |
| 1 - 0 = | 1 |
| 1 - 1 = | 0 |
Odejmując 0 - 1 otrzymujemy wynik 1 i pożyczkę (ang. borrow) do następnej pozycji. Pożyczka oznacza konieczność odjęcia 1 od wyniku odejmowania cyfr w następnej kolumnie. Identycznie postępujemy w systemie dziesiętnym, tyle że tam jest to o wiele bardziej skomplikowane.
Na razie załóżmy, iż od liczb większych odejmujemy mniejsze (w przeciwnym razie musielibyśmy wprowadzić liczby ujemne, a nie chcemy tego robić w tym miejscu).
Przykład:
Wykonać odejmowanie w systemie binarnym 1101110(2) - 1111(2).
| 1101110 | |
| - | 1111 |
| 1 | |||||||
| 1 | 1 | 0 | 1 | 1 | 1 | 0 | |
| - | 1 | 1 | 1 | 1 | |||
| 1 |
Odjęcie cyfr w drugiej od końca kolumnie daje wynik 1 - 1 = 0. Od tego wyniku musimy odjąć pożyczkę 0 - 1 = 1 i pożyczka do następnej kolumny.
| 1 | 1 | ||||||
| 1 | 1 | 0 | 1 | 1 | 1 | 0 | |
| - | 1 | 1 | 1 | 1 | |||
| 1 | 1 |
Według tych zasad kontynuujemy odejmowanie cyfr w pozostałych kolumnach. Pamiętaj o pożyczkach! Jeśli w krótszej liczbie zabraknie cyfr, to możemy kolumny wypełnić zerami:
| 1 | 1 | 1 | 1 | 1 | |||
| 1 | 1 | 0 | 1 | 1 | 1 | 0 | |
| - | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
| 1 | 0 | 1 | 1 | 1 | 1 | 1 |
1101110(2) - 1111(2) = 1011111(2) (110(10) - 15(10) = 95(10)).
Oto kilka dalszych przykładów:
|
|
|
Uwaga, pułapka:Przy odejmowaniu również może dochodzić do nieprawidłowych sytuacji. Jeśli od liczby mniejszej odejmiemy większą, to wynik będzie ujemny. Jednakże w naturalnym systemie binarnym nie można zapisywać liczb ujemnych. Zobaczmy zatem co się stanie, gdy od liczby 0 odejmiemy 1, a wynik ograniczymy do 8 bitów:
Otrzymujemy same jedynki, a pożyczka nigdy nie zanika. Sytuacja
taka nazywa się niedomiarem (ang. underflow)
i występuje zawsze, gdy wynik operacji arytmetycznej jest mniejszy
od dolnego zakresu formatu liczb binarnych (dla naturalnego kodu
dwójkowego wynik mniejszy od
|
Naukę mnożenia binarnego rozpoczynamy od tabliczki mnożenia. Bez paniki - jest ona równie prosta jak podane powyżej tabliczki dodawania i odejmowania.
| 0 × 0 = | 0 |
| 0 × 1 = | 0 |
| 1 × 0 = | 0 |
| 1 × 1 = | 1 |
Tabliczka mnożenia binarnego (podobnie jak w systemie dziesiętnym) posłuży do tworzenia iloczynów częściowych cyfr mnożnej przez cyfry mnożnika. Iloczyny te następnie dodajemy wg opisanych zasad i otrzymujemy wynik mnożenia.
Przykład:
Pomnożyć binarnie liczbę 1101(2) przez 1011(2).
| 1101 | |
| × | 1011 |
| 1 | 1 | 0 | 1 | ||||
| × | 1 | 0 | 1 | 1 | |||
| 1 | 1 | 0 | 1 | ||||
| 1 | 1 | 0 | 1 | ||||
| 0 | 0 | 0 | 0 | ||||
| 1 | 1 | 0 | 1 |
Zwróć uwagę, iż wynikiem mnożenia mnożnej przez cyfrę
mnożnika jest powtórzenie mnożnej z przesunięciem o pozycję
cyfry (cyfra mnożnika 1) lub same zera
(cyfra mnożnika 0).
Spostrzeżenie to bardzo ułatwia konstrukcję układów mnożących.
Puste kolumny uzupełniamy zerami i dodajemy do siebie wszystkie cyfry w kolumnach. Uważaj na przeniesienia.
| 1 | 1 | 0 | 1 | ||||
| × | 1 | 0 | 1 | 1 | |||
| 0 | 0 | 0 | 1 | 1 | 0 | 1 | |
| 0 | 0 | 1 | 1 | 0 | 1 | 0 | |
| + | 1 | 1 | 0 | 1 | 0 | 0 | 0 |
| 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
Sprawdź, czy otrzymany wynik jest poprawny.
Oto kilka dalszych przykładów:
|
|
|
Uwaga, pułapka:Z uwagi na ustalone formaty danych binarnych w komputerach (8, 16 i 32 bity) mnożenie również może dawać niepoprawne rezultaty, gdy wynik będzie większy od górnego zakresu liczb dla danego formatu, czyli od
max = 2n - 1, gdzie n - liczba bitów w danym formacie.
Poniżej prezentujemy odpowiedni przykład programowy:
|
|
|
Dzielenie binarne jest najbardziej skomplikowaną operacją arytmetyczną z dotychczas opisywanych. Wymyślono wiele algorytmów efektywnego dzielenia, ale dla potrzeb tego opracowania wystarczy znany wam algorytm szkolny, który polega na cyklicznym odejmowaniu odpowiednio przesuniętego dzielnika od dzielnej. W systemie dwójkowym jest to szczególnie proste, ponieważ dzielnika nie musimy mnożyć.
Przykład:
Podzielimy liczbę 1101(2) przez 10(2) (13(10) : 2(10)).
| 1101 | - dzielna |
| 10 | - przesunięty dzielnik |
| 1 | - pierwsza cyfra wyniku dzielenia | ||||
| 1 | 1 | 0 | 1 | - dzielna | |
| - | 1 | 0 | - przesunięty dzielnik | ||
| 0 | 1 | 0 | 1 | - wynik odejmowania dzielnika od dzielnej |
| 1 | 1 | 0 | - wynik dzielenia | ||
| 1 | 1 | 0 | 1 | - dzielna | |
| - | 1 | 0 | - przesunięty dzielnik | ||
| 0 | 1 | 0 | 1 | - dzielna po pierwszym odejmowaniu przesuniętego dzielnika | |
| - | 1 | 0 | - przesunięty dzielnik | ||
| 0 | 0 | 0 | 1 | - dzielna po drugim odejmowaniu przesuniętego dzielnika | |
| - | 1 | 0 | - dzielnik na swoim miejscu, odejmowanie niemożliwe | ||
| 0 | 0 | 0 | 1 | - reszta z dzielenia |
W naszym przykładzie otrzymaliśmy wynik dzielenia równy:
1101(2) : 10(2) = 110(2) i resztę 1(2) (6(10) i 1(10))
Jest to wynik poprawny, gdyż 2 mieści się w 13 sześć razy i pozostaje reszta 1.
Przykład:
Dla wprawki podzielmy liczbę 110101101(2) przez 111(2) (429(10) przez 7(10)):
0111101 - wynik
dzielenia
110101101 : 111
111
- nie da się odjąć, nad kreską 0
110101101
111
- da się odjąć, nad kreską 1
11001101
111
- da się odjąć, nad kreską 1
1011101
111
- da się odjąć, nad kreską 1
100101
111
- da się odjąć, nad kreską 1
1001
111
- nie da się odjąć, nad kreską 0
1001
111 - da się odjąć, nad kreską 1, koniec
10 -
reszta z dzielenia
110101101(2) : 111(2) = 111101(2) i reszta 10(2) (429(10) : 7(10) = 61(10) i reszta 2(10)).
Czy nie wykonując dzielenia binarnego potrafiłbyś oszacować ilość cyfr wyniku na podstawie znajomości dzielnej i dzielnika? Odpowiedź uzasadnij.
Podaj szybką regułę mnożenia liczb binarnych przez 2n, gdzie n = 1,2,3...
Podaj szybką regułę dzielenia liczb binarnych przez 2n, gdzie n = 1,2,3...
Podaj szybką regułę mnożenia liczby binarnej przez 10(10).
Operacje arytmetyczne dodawania, odejmowania i mnożenia mogły w przypadku ustalonego formatu liczb dawać niepoprawne wyniki. Czy taką cechę posiada również operacja dzielenia dwójkowego? Odpowiedź uzasadnij.
Jakie wartości może przyjmować reszta z dzielenia całkowitego dwóch liczb? Jaki wniosek wyciągniesz, jeśli jest ona różna od zera i równa zero?
Zobacz dalej...
Kody binarne | Naturalny system dwójkowy | Dwójkowy system stałoprzecinkowy | Operacje logiczne na bitach | Konwersje dwójkowo ósemkowe i szesnastkowe
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 |