System liczbowy to zbiór reguł jednolitego zapisu i nazewnictwa liczb. Na co dzień korzystamy z systemu dziesiętnego. Zapis dłuższych liczb w systemie binarnym jest nieefektywny. Znamy już system szesnastkowy – pozwala na krótszy i czytelniejszy zapis liczb. Składa się z 16 cyfr – od 0 do 9 oraz od A do F. Napiszemy program konwertujący liczbę z systemu binarnego na szesnastkowy. Konwersja składa się z dwóch etapów: Pierwszy konwertuje liczbę zapisaną w systemie binarnym na dziesiętny. Drugi zamieni liczbę zapisaną w systemie dziesiętnym na szesnastkowy. Zapiszmy funkcję decKonwerter, która przyjmie jeden argument – liczbę typu string. Będzie przechowywała liczbę, którą chcemy skonwertować. Wewnątrz funkcji umieścimy kod konwertera, który korzysta ze schematu Hornera, zamieniającego liczbę zapisaną w systemie binarnym na dziesiętną. Zwracamy wynik. Oto część kodu: 1 import java.util.Scanner; 2 3 public class Zadanie { 4 static int decKonwerter(String liczba) { 5 int wynik = Character.getNumericValue(liczba.charAt(0)); 6 for(int i = 1; i < liczba.lenght(); i++) { 7 wynik = wynik " 2 + Charakter.getNumericCalue(liczba.charAt(i)); 8 } 9 10 return wynik; 11 } 12 13- public static void main(String[] args) { 14 15 } 16 } 17 Drugi krok to zamiana liczby dziesiętnej na szesnastkową. Użyjmy funkcji hexKonwerter; przyjmie jeden argument: liczbę typu całkowitoliczbowego. Operacja konwersji dzieli się na dwa cykliczne etapy. Najpierw liczymy resztę z dzielenia liczby przez 16. Wynik zapisujemy do zmiennej wynik. Następnie dzielimy całkowitoliczbowo liczbę przez 16. Instrukcje powtarzamy, dopóki liczba jest większa od 0. Zapiszmy pętlę while wykonującą się, dopóki liczba będzie większa od 0. Wewnątrz pętli do zmiennej wynik zapiszemy wynik działania funkcji przeliczLiczbę. Za pomocą konkatenacji dołączamy do niej poprzednią wartość zmiennej wynik. 1 import java.util.Scanner; 2 3 public class Zadanie { 4 5- static void hexKonwerter(int liczba) { 6 String wynik = ""; 7 while(liczba > 0) { 8 wynik = przeliczliczbe(liczba % 16) + wynik; 9 } 10 } 11 12- static int decKonwerter(String liczba) { 13 int wynik = Character.getNumericValue(liczba.charAt(0)); 14 for(int i = 1; i < liczba.lenght(); i++) { 15 wynik = wynik " 2 + Charakter.getNumericCalue(liczba.charAt(i)); 16 } 17 18 return wynik; 19 } 20 21- public static void main(String[] args) { 22 23 } 24 } 25 Do funkcji przeliczLiczbę przekażemy jeden argument: wynik działania liczba modulo 16. Zadaniem funkcji przeliczLiczbę jest zamiana liczby całkowitej z zakresu 0 – 15 na jej odpowiednik zapisany w formie napisu. Dziesięć zamieniamy na A, 11 na B, 12 – C, 13 – D, 14 – E, 15 – F. 1 import java.util.Scanner; 2 3 public class Zadanie { 4 5- static String przeliczliczbe(int liczba) { 6 switch(liczba) { 7 case 10: 8 return "A"; 9 case 11: 10 return "B"; 11 case 12: 12 return "C"; 13 case 13: 14 return "D"; 15 case 14: 16 return "E"; 17 case 15: 18 return "F"; 19 default: 20 return Integer.toString(liczba); 21 } 22 } 23 24- static void hexKonwerter(int liczba) { 25 String wynik = ""; 26 while(liczba > 0) { 27 wynik = przeliczliczbe(liczba % 16) + wynik; 28 } 29 } 30 31- static int decKonwerter(String liczba) { 32 int wynik = Character.getNumericValue(liczba.charAt(0)); 33 for(int i = 1; i < liczba.lenght(); i++) { 34 wynik = wynik " 2 + Charakter.getNumericCalue(liczba.charAt(i)); 35 } 36 37 return wynik; 38 } 39 40- public static void main(String[] args) { 41 42 } 43 } 44 Wracamy do implementacji hexKonwerter. Wyznaczamy nową wartość zmiennej liczba, dzieląc ją całkowitoliczbowo przez 16. Na zewnątrz pętli zapiszemy operację wydruku wyniku. 1 import java.util.Scanner; 2 3 public class Zadanie { 4 5- static String przeliczliczbe(int liczba) { 6 switch(liczba) { 7 case 10: 8 return "A"; 9 case 11: 10 return "B"; 11 case 12: 12 return "C"; 13 case 13: 14 return "D"; 15 case 14: 16 return "E"; 17 case 15: 18 return "F"; 19 default: 20 return Integer.toString(liczba); 21 } 22 } 23 24- static void hexKonwerter(int liczba) { 25 String wynik = ""; 26 while(liczba > 0) { 27 wynik = przeliczliczbe(liczba % 16) + wynik; 28 liczba = liczba / 16; 29 } 30 System.out.printIn(wynik) 31 } 32 33- static int decKonwerter(String liczba) { 34 int wynik = Character.getNumericValue(liczba.charAt(0)); 35 for(int i = 1; i < liczba.lenght(); i++) { 36 wynik = wynik " 2 + Charakter.getNumericCalue(liczba.charAt(i)); 37 } 38 39 return wynik; 40 } 41 42- public static void main(String[] args) { 43 44 } 45 } 46 Wywołajmy kolejne operacje, aby uzyskać wynik. Przypomnijmy, że wprowadzamy liczbę zapisaną w systemie binarnym, którą zamieniamy na liczbę zapisaną w systemie dziesiętnym, a tę z kolei zamieniamy na system szesnastkowy. 1 import java.util.Scanner; 2 3 public class Zadanie { 4 5- static String przeliczliczbe(int liczba) { 6 switch(liczba) { 7 case 10: 8 return "A"; 9 case 11: 10 return "B"; 11 case 12: 12 return "C"; 13 case 13: 14 return "D"; 15 case 14: 16 return "E"; 17 case 15: 18 return "F"; 19 default: 20 return Integer.toString(liczba); 21 } 22 } 23 24- static void hexKonwerter(int liczba) { 25 String wynik = ""; 26 while(liczba > 0) { 27 wynik = przeliczliczbe(liczba % 16) + wynik; 28 liczba = liczba / 16; 29 } 30 System.out.printIn(wynik) 31 } 32 33- static int decKonwerter(String liczba) { 34 int wynik = Character.getNumericValue(liczba.charAt(0)); 35 for(int i = 1; i < liczba.lenght(); i++) { 36 wynik = wynik " 2 + Charakter.getNumericCalue(liczba.charAt(i)); 37 } 38 39 return wynik; 40 } 41 42- public static void main(String[] args) { 43 Scanner sc = new Scanner(System.in); 44 System.out.printIn("Podaj liczbę do konwersji:"); 45 String liczba = sc.nextLine(); 46 int dec = decKonwerter(liczba); 47 hexKonwerter(der); 48 } 49 } 50 Prześledźmy działanie naszego programu dla liczby: 11010, czyli 26. W analizie pominiemy konwersję liczby z systemu binarnego na dziesiętny. Podświetlono linijki kodu od 33 do 40. Prześledźmy działanie funkcji hexKonwerter dla liczby 26. Zmienna wynik jest pustym napisem. W pętli sprawdzamy, czy liczba jest większa od 0. Jest to prawda, wchodzimy więc do wnętrza pętli. 26 modulo 16 wynosi 10. Przekazujemy 10 do funkcji pomocniczej przeliczLiczbę. Otrzymujemy wartość liczby w systemie szesnastkowym – A. Nowa wartość zmiennej wynik wynosi A. Obliczamy nową wartość zmiennej liczba: 26 dzielone całkowitoliczbowo na 16 wynosi 1. Wracamy do nagłówka pętli. Sprawdzamy, czy liczba, czyli 1, jest większa od 0. Warunek ponownie jest prawdziwy, więc wchodzimy do środka pętli. 1 modulo 16 równa się 1. Przekazujemy 1 do funkcji pomocniczej przeliczLiczbę. Otrzymujemy wartość liczby w systemie szesnastkowym: 1. Obliczamy nową wartość zmiennej wynik: 1A. Wracamy do nagłówka pętli. Liczba nie jest większa od 0, więc pętla się nie wykona. Drukujemy wynik: 1A. Sprawdźmy poprawność działania programu, uruchamiając kalkulator w trybie programisty. Poinformujmy program, że liczbę będziemy wprowadzać w systemie binarnym, klikając BIN. Wpiszmy wartość 11010. Przy pasku HEX pojawi się przeliczona liczba – 1A. W oknie kalkulatora wpisano: Podaj liczbę do konwersji: 11010 1A Widzimy, że program przeliczył dane poprawnie. Konwersja między systemami binarnym a szesnastkowym wymaga dwóch operacji: konwersji liczby binarnej na dziesiętną i zamiany liczby z systemu dziesiętnego na szesnastkowy. System szesnastkowy składa się z 16 cyfr: od 0 do 9 oraz od A do F. Konwersję z systemu binarnego na dziesiętny możemy przeprowadzić, wykorzystując schemat Hornera. To algorytm służący do obliczenia wartości wielomianu. Redukuje liczbę mnożeń do minimum. Istnieje inny sposób konwersji liczby z systemu dwójkowego na szesnastkowy. Wykorzystuje on bazy skojarzone, czyli to, że podstawa jednego systemu jest potęgą podstawy drugiego.