I_R_W14_M34_Java Działania na liczbach w innych systemach
Algorytm konwersji liczby z systemu binarnego na szesnastkowy
Przeanalizujmy zadanie polegające na konwersji liczb z systemu dwójkowego na szesnastkowy i zaimplementujmy realizujący je algorytm w języku Java.
W systemie o podstawie 16, oprócz cyfr z zakresu <0, 9>, dysponujemy także literami od A do F. Tabela prezentuje ich wartości dziesiętne.
Symbol | Wartość |
A | 10 |
B | 11 |
C | 12 |
D | 13 |
E | 14 |
F | 15 |
Naszym zadaniem jest przekonwertowanie liczby binarnej 10010101 na system szesnastkowy.
Gdybyśmy mieli do dyspozycji kartkę i długopis, najpierw przeprowadzilibyśmy konwersję z systemu binarnego na dziesiętny, a następnie na notację szesnastkową. Wyglądałoby to następująco:
Aby przekonwertować liczbę z systemu dwójkowego do systemu dziesiętnego, obliczamy sumę iloczynów wszystkich cyfr danej liczby i odpowiadających im wag (czyli w przypadku systemu binarnego kolejnych potęg liczby 2). Możemy w tym celu zastosować również schemat Horneraschemat Hornera.
Oto wynik końcowy pierwszej konwersji:
Otrzymany wynik konwertujemy następnie do systemu docelowego, czyli szesnastkowego.

Przeanalizujmy listę kroków algorytmu (liczbaDec oznacza liczbę, którą chcemy zamienić na system szesnastkowy):
Weź
liczbaDeci podziel ją całkowicie przez podstawę systemu docelowego, czyli 16. W pokazanym wyżej przykładzie bierzemy liczbę 149 i dzielimy ją całkowicie przez 16.Zapisz wynik reszty z dzielenia całkowitego z kroku 1. Reszta z dzielenia całkowitego 149 przez 16 to 5.
Zapisz wynik dzielenia całkowitego z kroku 1. do zmiennej
liczbaDec. Wynik dzielenia całkowitego 149 przez 16 to 9.Powtarzaj kroki 1‑3, aż do osiągnięcia przez
liczbaDecwartości 0. Kolejne dzielenie całkowite, które zostanie wykonane, to 9 przez 16, reszta z tego dzielenia to 9, a wynik dzielenia całkowitego to 0, co kończy powtarzanie dzielenia.Wynikiem jest liczba szesnastkowa, składająca się z reszt z dzielenia zapisanych od końca. W naszym przykładzie jest to liczba 95.
Oto wynik zadania:
Realizacja algorytmu w języku Java
Przejdźmy do implementacji przedstawionego algorytmu w języku Java. Program będzie wykonywał następujące operacje:
pobranie liczby binarnej z klawiatury,
przekształcenie liczby binarnej na dziesiętną – do tego celu użyjemy wbudowanej funkcji
parseInt(),przekształcenie liczby dziesiętnej na szesnastkową za pomocą funkcji
dec2Hex(), którą napiszemy,wypisanie wyniku.
Zacznijmy od głównej funkcji programu:
Konwertowaną liczbę binarną pobieramy z klawiatury i zapisujemy w zmiennej liczbaBin. Zanim użyjemy funkcji parseInt() sprawdzamy, czy podana liczba bitów jest mniejsza od 32, ponieważ wspomniana funkcja ma pewne ograniczenia.
Funkcja ta przyjmuje dwa argumenty: liczbę w postaci ciągu znaków oraz podstawę systemu, w którym zapisana jest liczba. Podana liczba musi zawierać tylko cyfry sytemu podanego jako podstawa. Ponieważ zakres wartości typu Integer to <-2Indeks górny 3131, 2Indeks górny 3131 - 1>, największa liczba binarna, która zostanie poprawnie zamieniona, może składać się z co najwyżej 31 bitów o wartości 1.
W programie używamy więc instrukcji warunkowej, która sprawdza podaną liczbę bitów. Jeżeli jest ich mniej niż 32, liczbę binarną zamieniamy na dziesiętną przy użyciu funkcji parseInt, następnie wywołujemy funkcję Dec2Hex() oraz wypisujemy zwrócony rezultat konwersji. W przeciwnym wypadku wypisujemy stosowny komunikat i kończymy program.
Następny krok to utworzenie funkcji dec2Hex(), która przekształci podaną liczbę dziesiętną na szesnastkową.
Funkcja zwraca ciąg znaków typu string. Konwersji dokonujemy poprzez dopisywanie („doklejanie”) do zmiennej liczbaHex kolejnych reszt z dzielenia przez 16.
Opis działania funkcji
W linii 2 sprawdzamy, czy konwertowana liczba jest równa 0, jeżeli tak, możemy od razu zwrócić 0 i zakończyć działanie funkcji (linia 3).
W przeciwnym wypadku deklarujemy zmienne:
String liczbaHex = ""– w której zapisany jest wynik końcowy konwersji (linia 5),int reszta = 0– która przechowuje reszty z dzielenia przez 16 (linia 6).
Kolejny krok to wywołanie w linii 8. pętli while, która wykonuje instrukcje dopóty, dopóki liczba_dec jest większa od 0.
W linii 9. sprawdzamy, czy reszta z dzielenia przez 16 zawiera się w przedziale <0, 9>. Jeżeli warunek jest spełniony, w linii 10. zapisujemy wynik operacji liczba_dec % 16 do zmiennej reszta, po czym w linii 11. dopisujemy („doklejamy”) go do liczbaHex.
W przeciwnym wypadku w linii 13 do zmiennej reszta wpisujemy wynik operacji liczba_dec % 16 - 10 + A. Odejmując 10 i dodając A, spowodujemy, że w zmiennej reszta będą mogły się znajdować jedynie kody ASCII znaków od A do F.
Następnie w linii 14. wykonujemy rzutowanie zmiennej reszta, która jest liczbą całkowitą, na typ char. W wyniku tej operacji liczba zapisana w zmiennej reszta zmienia się w odpowiadający jej znak z tablicy ASCII. Następnie zmienną reszta doklejamy do liczbaHex.
Zgodnie z algorytmem w 17 linii funkcji wykonujemy dzielenie całkowite zmiennej liczbaDec przez podstawę systemu.
Na końcu w linii 20. zwracamy wynik – jest on zapisany w zmiennej liczbaHex.
Poniżej kod całego programu zawierający omówioną funkcję:
W przedstawionym programie wykorzystaliśmy gotową wbudowaną funkcję parseInt(), która może posłużyć do zamiany liczby binarnej zawierającej nie więcej niż 31 bitów na liczbę dziesiętną. W filmie zamieszczonym w sekcji „Prezentacja multimedialna” zaprezentowane jest rozwiązanie oparte na schemacie Hornera pozbawione omówionych ograniczeń funkcji parseInt().
Słownik
pozycyjny system zapisu liczb, którego podstawą jest liczba 2 - w zapisie tym występują wyłącznie cyfry 0 oraz 1
pozycyjny system zapisu liczb, którego podstawą jest liczba 16 – w zapisie tym oprócz cyfr od 0 do 9 występują jeszcze znaki A, B, C, D, E, F, oznaczające odpowiednio cyfry od 10 do 15