Odejmowanie liczb w systemie binarnym - zły wynik działania

szczypmen
Użytkownik
Użytkownik
Posty: 24
Rejestracja: 10 sty 2010, o 17:19
Płeć: Mężczyzna
Podziękował: 3 razy

Odejmowanie liczb w systemie binarnym - zły wynik działania

Post autor: szczypmen »

Witam,
Uczę się z książki "Podręcznik do nauki zawodu Technik Informatyk: Urządzenia Techniki Komputerowej wyd. z roku 2011" i jestem w temacie 3.2.2 "Odejmowanie liczb binarnych".

Dwa przykłady w tekście zrozumiałem, ale przykładu wymyślonego przeze mnie nie byłem w stanie rozwiązać.
Oto on:

\(\displaystyle{ \ \ \ \ 1010010011_{B}\\- \ \underline{1101011010_{B}}}\)

Obliczyłem już, że \(\displaystyle{ 1010010011_{B}=659}\) a \(\displaystyle{ 1101011010_{B}=858}\), natomiast wynikiem odejmowania \(\displaystyle{ 659-858=-199}\) a wg. konwersji na system binarny, \(\displaystyle{ -199}\) to binarne \(\displaystyle{ 10011000111_{ZM}}\) ale podczas odejmowania binarnego "pod kreską" wychodzi mi zupełnie co innego (w tym wypadku "pożyczam" jedynki dla reszty zer).

Moim problemem jest niecałkowite zrozumienie zasad odejmowania binarnego - chodzi o proces pożyczania.
Gdy pożyczam te pogrubione jedynki na rzecz zer znajdujących się za nimi, tak jak robi się to w przypadku odejmowania "pod kreską" liczb w systemie dziesiętnym (gdy w jednej kolumnie od mniejszej liczby odejmuje się większą, wtedy z następnej kolumny "pożycza się" liczbę), wychodzi to:

\(\displaystyle{ \ \ \ \ 10\textbf{1}00\textbf{1}0011_{B}\\- \ \underline{1101011010_{B}} \\ \phantom{.} \ \ \ 1010100101_{B}}\)

Niestety \(\displaystyle{ 1010100101_{B}}\) to decymalne \(\displaystyle{ 677}\)

[Tam wyżej wstawiłem kropkę, żeby wynik działania się nie rozłaził.]

Czy jest mi ktoś w stanie wytłumaczyć odejmowanie binarne, także na jakichś trudniejszych przykładach? W artykule na wiki przykład pożyczania jedynek jest banalny, ja potrzebuję trochę bardziej złożonych, podobnych do mojego. W mojej książce też nie ma trudniejszych, a nie widzę żeby było wytłumaczone jak postępować w takich przypadkach.

Dziękuję
Ostatnio zmieniony 31 gru 2011, o 12:05 przez szczypmen, łącznie zmieniany 1 raz.
aalmond
Użytkownik
Użytkownik
Posty: 2911
Rejestracja: 1 maja 2006, o 21:13
Płeć: Mężczyzna
Lokalizacja: Kraków
Pomógł: 623 razy

Odejmowanie liczb w systemie binarnym - zły wynik działania

Post autor: aalmond »

Zastosujemy zasadę dodawania liczby przeciwnej.
Liczbę na przeciwną zamieniamy w następujący sposób:
1. Dodajemy na początku jedno zero (bit znaku)
1. Dokonujemy inwersji bitów
2. Wynik zwiększamy o \(\displaystyle{ 1}\)

po inwersji:
\(\displaystyle{ 10010100101}\) (pierwszy bit z lewej, to bit znaku)

i po dodaniu \(\displaystyle{ 1}\):
\(\displaystyle{ 10010100110}\)

i teraz 'zwykłe' dodawanie:

\(\displaystyle{ 01010010011 \\ \underline
{10010100110} \\
11100111001}\)
(jedynka na początku oznacza, że mamy liczbę ujemną)

Dekodujemy:
zmniejszamy o \(\displaystyle{ 1}\):

\(\displaystyle{ 11100111000}\)

i dokonujemy inwersji

\(\displaystyle{ 00011000111}\)
Uwzględniamy to, że przed inwersją na początku była jedynka, czyli mamy de facto liczbę ujemną
szczypmen
Użytkownik
Użytkownik
Posty: 24
Rejestracja: 10 sty 2010, o 17:19
Płeć: Mężczyzna
Podziękował: 3 razy

Odejmowanie liczb w systemie binarnym - zły wynik działania

Post autor: szczypmen »

Dzięki za odpowiedź, ale po co robisz inwersję i zwiększasz wynik o jeden? Bez tego zabiegu nie otrzyma się poprawnego wyniku? Nie istnieje prostszy sposób, bez żadnych dodatkowych manipulacji?
Ostatnio zmieniony 31 gru 2011, o 12:15 przez Anonymous, łącznie zmieniany 1 raz.
Powód: Nie cytuj całego poprzedniego posta.
aalmond
Użytkownik
Użytkownik
Posty: 2911
Rejestracja: 1 maja 2006, o 21:13
Płeć: Mężczyzna
Lokalizacja: Kraków
Pomógł: 623 razy

Odejmowanie liczb w systemie binarnym - zły wynik działania

Post autor: aalmond »

Ten sposób stosujesz, odejmując liczbę większą od mniejszej. Jest inny sposób tzw. dopełnienie do 1, ale tam również robi się inwersję.
Możesz oczywiście odejmować tak:
\(\displaystyle{ 659 - 858 = - (858 - 659)}\)
tzn. zamienić miejscami liczby przy odejmowaniu, pamiętając, że wynik ma być ujemny. Czy to jest jednak lepszy sposób?
szczypmen
Użytkownik
Użytkownik
Posty: 24
Rejestracja: 10 sty 2010, o 17:19
Płeć: Mężczyzna
Podziękował: 3 razy

Odejmowanie liczb w systemie binarnym - zły wynik działania

Post autor: szczypmen »

Czyli mam rozumieć, że podczas stosowania zasady dodawania liczby przeciwnej, w działaniach na liczbach binarnych, zawsze do liczby mniejszej dodaję bit znaku adekwatny do wartości liczby (czyli 0 jeśli dodatnia a 1 jeśli ujemna) i tylko do liczby mniejszej, a inwersję przeprowadzam zawsze, tylko na liczbie większej, zwiększając ją następnie o \(\displaystyle{ 1_{B}}\), tak?
Czy są jakieś odstępstwa od reguły?
aalmond
Użytkownik
Użytkownik
Posty: 2911
Rejestracja: 1 maja 2006, o 21:13
Płeć: Mężczyzna
Lokalizacja: Kraków
Pomógł: 623 razy

Odejmowanie liczb w systemie binarnym - zły wynik działania

Post autor: aalmond »

Inwersję przeprowadzasz przy zamianie liczby na przeciwną. Bez względu na to, czy jest odjemną, czy odjemnikiem.
W przykładzie poniżej obie liczby są ujemne:
\(\displaystyle{ P = -3 + (- 7) \\
(1)1101 + (1)1001 = 1(1)0110}\)

w nawiasach są bity znaku
nadmiarową jedynkę (przed bitem znaku) w wyniku odrzucasz
szczypmen
Użytkownik
Użytkownik
Posty: 24
Rejestracja: 10 sty 2010, o 17:19
Płeć: Mężczyzna
Podziękował: 3 razy

Odejmowanie liczb w systemie binarnym - zły wynik działania

Post autor: szczypmen »

Btw. dzięki Ci za pomoc
aalmond pisze:Inwersję przeprowadzasz przy zamianie liczby na przeciwną. Bez względu na to, czy jest odjemną, czy odjemnikiem.
Czyli mogę sobie sam wybrać, czy chcę przeprowadzić inwersję na liczbie mniejszej czy większej? I tak wynik powinien być prawidłowy?

Bo widzę że w pierwszej Twojej odpowiedzi, inwersji poddałeś tylko \(\displaystyle{ 1101011010_{B}}\) czyli \(\displaystyle{ 858}\), a potem dodałeś bit znaku, natomiast do \(\displaystyle{ 1010010011_{B}}\) czyli \(\displaystyle{ 659}\), dodałeś tylko bit znaku. To mnie zastanawiało.
aalmond
Użytkownik
Użytkownik
Posty: 2911
Rejestracja: 1 maja 2006, o 21:13
Płeć: Mężczyzna
Lokalizacja: Kraków
Pomógł: 623 razy

Odejmowanie liczb w systemie binarnym - zły wynik działania

Post autor: aalmond »

Czyli mogę sobie sam wybrać, czy chcę przeprowadzić inwersję na liczbie mniejszej czy większej?
Nie do końca. Nie dokonujemy inwersji na liczbie dodatniej.
W Twoim przykładzie jest:
\(\displaystyle{ 659 - 858 = 659 + (-858)}\)
a więc inwersja jest tylko na drugiej liczbie i oczywiście na wyniku, który też jest ujemny
szczypmen
Użytkownik
Użytkownik
Posty: 24
Rejestracja: 10 sty 2010, o 17:19
Płeć: Mężczyzna
Podziękował: 3 razy

Odejmowanie liczb w systemie binarnym - zły wynik działania

Post autor: szczypmen »

aalmond pisze:a więc inwersja jest tylko na drugiej liczbie i oczywiście na wyniku, który też jest ujemny
Czyli inwersję zawsze robi się tylko na liczbie ujemnej oraz na wyniku, który otrzymaliśmy z działania na liczbach, z których chociaż jedna też przeszła inwersję. No i po wszystkim do zdekodowanego wyniku (czyli tego, który przeszedł ponowną, obowiązkową inwersję) dodajemy bit znaku i voilà, mamy prawidłowy wynik. Tak?
aalmond
Użytkownik
Użytkownik
Posty: 2911
Rejestracja: 1 maja 2006, o 21:13
Płeć: Mężczyzna
Lokalizacja: Kraków
Pomógł: 623 razy

Odejmowanie liczb w systemie binarnym - zły wynik działania

Post autor: aalmond »

oraz na wyniku, który otrzymaliśmy z działania na liczbach
tylko, jeżeli wynik jest ujemny
dodajemy bit znaku
bit znaku jest już ustawiony
szczypmen
Użytkownik
Użytkownik
Posty: 24
Rejestracja: 10 sty 2010, o 17:19
Płeć: Mężczyzna
Podziękował: 3 razy

Odejmowanie liczb w systemie binarnym - zły wynik działania

Post autor: szczypmen »

Czyli inwersję zawsze robi się tylko na liczbie ujemnej oraz na wyniku - jeżeli wynik jest ujemny - który otrzymaliśmy z działania na liczbach, z których chociaż jedna też przeszła inwersję.
Jeśli wynik jest ujemny, musi przejść obowiązkową inwersję (jak powiedziano wyżej), co daje ostatecznie zdekodowaną wartość-wynik.
aalmond
Użytkownik
Użytkownik
Posty: 2911
Rejestracja: 1 maja 2006, o 21:13
Płeć: Mężczyzna
Lokalizacja: Kraków
Pomógł: 623 razy

Odejmowanie liczb w systemie binarnym - zły wynik działania

Post autor: aalmond »

z których chociaż jedna też przeszła inwersję
Jeżeli żadna liczba nie przechodzi inwersja, to znaczy, że wynik na pewno będzie dodatni i nie potrzebuje inwersji.
Jeśli wynik jest ujemny, musi przejść obowiązkową inwersję, co daje ostatecznie zdekodowaną wartość-wynik.
Tak. A jeżeli wynik jest dodatni, podany jest wprost.
Przykład:

\(\displaystyle{ P = - 3 + 9 \\
(1)1101 + (0)1001 = 1(0)0110}\)
szczypmen
Użytkownik
Użytkownik
Posty: 24
Rejestracja: 10 sty 2010, o 17:19
Płeć: Mężczyzna
Podziękował: 3 razy

Odejmowanie liczb w systemie binarnym - zły wynik działania

Post autor: szczypmen »

aalmond pisze:
Jeśli wynik jest ujemny, musi przejść obowiązkową inwersję, co daje ostatecznie zdekodowaną wartość-wynik.
Tak. A jeżeli wynik jest dodatni, podany jest wprost.
Przykład:

\(\displaystyle{ P = - 3 + 9 \\
(1)1101 + (0)1001 = 1(0)0110}\)
Mam pytanie: dlaczego w wyniku (w tym przykładzie) bit znaku nie jest pisany na samym końcu wyniku, czyli jako ostatni bit w wyniku:

\(\displaystyle{ P = - 3 + 9 \\
(1)1101 + (0)1001 = \textbf{(0)1}0110}\)


Tak wygląda lepiej, ale pewnie nie jest poprawne - jeśli nie jest, to dlaczego?
aalmond
Użytkownik
Użytkownik
Posty: 2911
Rejestracja: 1 maja 2006, o 21:13
Płeć: Mężczyzna
Lokalizacja: Kraków
Pomógł: 623 razy

Odejmowanie liczb w systemie binarnym - zły wynik działania

Post autor: aalmond »

Tak wygląda lepiej, ale pewnie nie jest poprawne
Nie jest dobrze. Twój wynik, to \(\displaystyle{ 22}\).
Już to mówiłem, ale powtórzę:
nadmiarową jedynkę (przed bitem znaku) w wyniku odrzucasz, czyli wynik jest taki:
\(\displaystyle{ (0)0110}\) (dziesiętna szóstka) - bit znaku to zero, więc liczba jest dodatnia
szczypmen
Użytkownik
Użytkownik
Posty: 24
Rejestracja: 10 sty 2010, o 17:19
Płeć: Mężczyzna
Podziękował: 3 razy

Odejmowanie liczb w systemie binarnym - zły wynik działania

Post autor: szczypmen »

Ok, dzięki za pomoc. Bardzo dziękuję i pozdrawiam. Wszystkiego Najlepszego i Dużo Zdrowia w Nowym Roku
ODPOWIEDZ