R1ZMLXZLQKFZU

I_P_R_W14_M08_Java Konwersja liczb z systemu dziesiętnego na dwójkowy w języku Java

Konwertowanie liczb

Zanim napiszemy program przekształcający liczby dziesiętne do postaci w systemie dwójkowym (binarnym), przypomnimy algorytm konwersji.

Posłużymy się przykładem. Chcemy zapisać liczbę 2610 w systemie dwójkowym:

26102

Używając długopisu i kartki, rozwiązalibyśmy zadanie w następujący sposób:

Ruvi6PwajVoxh
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Zaczynamy od podzielenia liczby 26 przez 2 (czyli podstawę systemu binarnego). Zapisujemy resztę z dzielenia i otrzymany iloraz, który ponownie dzielimy przez 2. Wynikiem jest kolejna reszta i iloraz; resztę znowu zapisujemy, a iloraz dzielimy przez 2. Postępujemy tak aż do momentu, w którym iloraz wyniesie 0. Zapamiętane reszty z dzielenia, odczytane od ostatniej (najnowszej) do pierwszej, składają się na zapis liczby w postaci dwójkowej.

Przełóżmy opisane wyżej operacje na listę czynności:

  1. Dzielimy liczbę przez 2.

  2. Zapisujemy iloraz całkowity oraz resztę.

  3. Przyjmujemy iloraz całkowity za nową liczbę i wracamy do punktu 1. Czynności z punktów 1. i 2. powtarzamy do momentu, w którym iloraz wyniesie zero.

  4. Zapisujemy reszty z dzielenia otrzymane na kolejnych etapach w kolejności od ostatniej (najnowszej) do pierwszej (obliczonej podczas pierwszej operacji dzielenia). Tak uszeregowane cyfry 1 oraz 0 składają się na dwójkową postać konwertowanej liczby.

Rozwiązaniem przykładowego zadania jest zatem:

2610110102

Możemy przystąpić do napisania programu, w którym wykorzystamy opisany algorytm.

Realizacja algorytmu konwersji w języku Java

Chcemy napisać program, który odczyta podaną przez użytkownika całkowitą liczbę dziesiętną, przekształci ją do postaci dwójkowej, a następnie wypisze rezultat. Algorytm konwersji zrealizujemy w postaci osobnej funkcji, aby program był bardziej czytelny.

Zacznijmy od napisania tej części kodu, dzięki której użytkownik poda liczbę przeznaczoną do konwersji. Wykorzystamy w tym celu klasę Scanner oraz strumień wejścia (System.in):

Linia 1. Scanner scanner znak równości new Scanner otwórz nawias okrągły System kropka in zamknij nawias okrągły średnik. Linia 2. int liczbaTest znak równości scanner kropka nextInt otwórz nawias okrągły zamknij nawias okrągły średnik.

Zmienna liczbaTest przechowa liczbę wpisaną przez użytkownika za pomocą klawiatury.

Przejdźmy do zdefiniowania funkcji decBin(), odpowiadającej za proces konwersji:

Linia 1. public static String decBin otwórz nawias okrągły int liczbaDec zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. String wynik znak równości cudzysłów cudzysłów średnik. Linia 3. int reszta znak równości 0 średnik. Linia 4. otwórz nawias ostrokątny code style znak równości cudzysłów white minus space dwukropek pre średnik cudzysłów data minus inline zamknij nawias ostrokątny while otwórz nawias okrągły liczbaDec ampersant gt średnik 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. reszta znak równości liczbaDec procent 2 średnik. Linia 6. liczbaDec znak równości liczbaDec prawy ukośnik 2 średnik. Linia 7. wynik znak równości reszta plus wynik średnik. Linia 8. zamknij nawias klamrowy. Linia 10. return wynik średnik otwórz nawias ostrokątny prawy ukośnik code zamknij nawias ostrokątny. Linia 12. zamknij nawias klamrowy.

Funkcja zwróci wartość typu String, ponieważ wynikowa liczba w systemie binarnym będzie powstawać dzięki zapisywaniu kolejnych reszt z dzielenia (symboli 0 lub 1) od strony prawej do lewej (zapis zaczynamy od końca, czyli od bitu najmłodszego, a kończymy na najstarszym). Funkcja będzie miała jeden parametr, liczbę całkowitą liczbaDec. W momencie wywołania funkcji parametr przyjmie wartość argumentu – liczby dziesiętnej podanej przez użytkownika przeznaczonej do konwersji.

W ciele funkcji deklarujemy dwie zmienne: łańcuch znaków i liczbę (String wynik oraz int reszta). Pierwsza przechowuje wynik końcowy, czyli postać dwójkową liczby dziesiętnej. Zmiennej reszta będą przypisywane wartości kolejnych reszt z dzielenia przekształcanej liczby przez 2. Odpowiednią instrukcję zapisaliśmy w linii numer 7 (reszta = liczbaDec % 2). Operator % (modulo) służy do obliczania reszty z dzielenia.

Do zmiennej wynik dopisujemy („doklejamy”) kolejne reszty z dzielenia. Używamy przy tym operatora dodawania (+). Możemy tak postąpić, ponieważ zapisujemy rezultat przekształceń jako ciąg znaków (String), a nie liczbę. Zwróć jednak uwagę na kolejność działań. To do zmiennej reszta dopisujemy zmienną wynik, a nie odwrotnie. Jest to ważne, ponieważ rezultatem przekształceń są kolejne reszty zapisywane od strony prawej do lewej. Gdybyśmy odwrócili kolejność dodawania, to w przypadku konwertowania liczby 2610 otrzymalibyśmy błędny wynik  010112 zamiast poprawnego ciągu 110102.

Oto końcowa wersja kodu:

Linia 1. import java kropka util kropka Scanner średnik. Linia 3. public class DecBin otwórz nawias klamrowy. Linia 4. public static String decBin otwórz nawias okrągły int liczbaDec zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. String wynik znak równości cudzysłów cudzysłów średnik. Linia 6. int reszta znak równości 0 średnik. Linia 7. otwórz nawias ostrokątny code style znak równości cudzysłów white minus space dwukropek pre średnik cudzysłów data minus inline zamknij nawias ostrokątny while otwórz nawias okrągły liczbaDec ampersant gt średnik 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. reszta znak równości liczbaDec procent 2 średnik. Linia 9. liczbaDec znak równości liczbaDec prawy ukośnik 2 średnik. Linia 10. wynik znak równości reszta plus wynik średnik. Linia 11. zamknij nawias klamrowy. Linia 13. return wynik średnik. Linia 14. zamknij nawias klamrowy. Linia 16. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 17. Scanner scanner znak równości new Scanner otwórz nawias okrągły System kropka in zamknij nawias okrągły średnik. Linia 18. int liczbaTest znak równości scanner kropka nextInt otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 20. System kropka out kropka println otwórz nawias okrągły decBin otwórz nawias okrągły liczbaTest zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 21. zamknij nawias klamrowy otwórz nawias ostrokątny prawy ukośnik code zamknij nawias ostrokątny. Linia 23. zamknij nawias klamrowy.

W linii 21. wywołujemy funkcję decBin() i od razu podajemy wynik jej działania.