Serwis Edukacyjny w I-LO w Tarnowie ![]() Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2023 mgr Jerzy Wałaszek
|
Zasady arytmetyki w systemie dwójkowym są identyczne (prawie) jak w dobrze nam znanym systemie dziesiętnym. Zaletą arytmetyki dwójkowej 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):
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)). |
Wykonaj podane niżej dodawania w systemie dwójkowym:
Wykonaj podane niżej odejmowania w systemie dwójkowym:
Wykonaj podane niżej mnożenia w systemie dwójkowym:
Wykonaj podane niżej dzielenia w systemie binarnym
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
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2023 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.