|
Serwis Edukacyjny Nauczycieli I-LO w Tarnowie
Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2026 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:
Przykład:
Zsumować liczby binarne 1111001(2) oraz 10010(2).
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:
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).
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.
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:
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: |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
|
|
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
- |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
|
|
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
|
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 zera). Oczywiście otrzymany rezultat jest błędny:
C++// Niedomiar przy odejmowaniu
#include <iostream>
#include <iomanip>
using namespace std;
main()
{
unsigned char a; // dana 8 bitowa
unsigned short b; // dana 16 bitowa
unsigned long c; // dana 32 bitowa
char z[1];
a = 0; // wszystkie bity na 0
b = 0;
c = 0;
cout << " 8b 16b 32b" << endl
<< "Przed odejmowaniem 1 : "
<< setw(5) << (int) a
<< setw(7) << b
<< setw(12) << c << endl;
a--; b--; c--; // odejmujemy 1 od każdej zmiennej
cout << "Po odejmowaniu 1 : "
<< setw(5) << (int) a
<< setw(7) << b
<< setw(12) << c << endl;
cout << "\nNacisnij ENTER...\n";
system("pause");
return 0;
} |
Pascal// Niedomiar przy odejmowaniu program underflow; $APPTYPE CONSOLE} var a : byte; // dana 8 bitowa b : word; // dana 16 bitowa c : longword; // dana 32 bitowa begin a := 0; // wszystkie bity na 0 b := 0; |
| Wynik: |
|
8b 16b
32b Przed odejmowaniem 1 : 0 0 0 Po odejmowaniu 1 : 255 65535 4294967295 |
Naukę mnożenia binarnego rozpoczynamy od tabliczki mnożenia. Bez paniki - jest ona równie prosta jak podane powyżej tabliczki dodawania i odejmowania.
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).
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.
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)).
W naszym przykładzie otrzymaliśmy wynik dzielenia równy:
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)):
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 ©2026 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:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.