Przypomnijmy metodę konwersji całkowitych liczb binarnych do postaci dziesiętnej. Posłużymy się przykładem, dzięki któremu łatwiej nam będzie przełożyć algorytm na program w języku Java.
Zapiszemy liczbę 10111Indeks dolny (2)(2) w systemie dziesiętnym:
Oto rozwiązanie zadania:
RPvGb1TXAXyHV
Ilustracja ukazuje konwersję liczby binarnej na dziesiętną. BIN: 10111 = 1 razy w do potęgi 0 + 1 razy 2 do potęgi 1 + 1 razy dwa do potęgi drugiej + 0 razy dwa do potęgi trzeciej + 1 razy dwa do potęgi czwartej= 1+2+4+0+16=23
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Kolejne bity liczby dwójkowej mnożyliśmy przez odpowiadające im wagi, zaczynając od najmniej znaczącej cyfry (znajdującej się skrajnie po prawej stronie). Poszczególne wagi wynosiły: 2Indeks górny 00, 2Indeks górny 11, 2Indeks górny 22, 2Indeks górny 33, 2Indeks górny 44... (czyli były zwiększającymi się o 1 potęgami liczby 2). Następnie zsumowaliśmy otrzymane iloczyny i uzyskaliśmy dziesiętną postać liczby binarnej:
Realizacja algorytmu w języku Java
Rozpoczniemy od instrukcji, dzięki którym użytkownik poda liczbę do przekształcenia. Skorzystamy z wbudowanej klasy Scanner oraz strumienia wejścia System.in:
Linia 1. String liczbaTest średnik.
Linia 2. Scanner Scanner znak równości new Scanner otwórz nawias okrągły System kropka in zamknij nawias okrągły średnik.
Linia 4. System kropka out kropka println otwórz nawias okrągły cudzysłów Podaj liczbę do przekonwertowania na system dzisiętny cudzysłów zamknij nawias okrągły średnik.
Linia 5. liczbaTest znak równości Scanner kropka nextLine otwórz nawias okrągły zamknij nawias okrągły średnik.
String liczbaTest;
Scanner Scanner = new Scanner(System.in);
System.out.println("Podaj liczbę do przekonwertowania na system dzisiętny");
liczbaTest = Scanner.nextLine();
Następnie zadeklarujemy funkcję konwertujBinDec(). Właśnie ona będzie odpowiadać za realizację omówionego algorytmu.
Funkcja zwróci wartość typu int, a jako parametrparametrparametr przyjmie ciąg znaków (String) liczbaBin – jest to liczba dwójkowa traktowana jako tekst.
Nie bez powodu podajemy liczbę do przekształcenia w postaci ciągu znaków, a nie zmiennej typu całkowitego. Tak jest po prostu wygodniej, nie musimy dokonywać jej konwersji do łańcucha znaków. Dodatkowo, podczas konwersji chcemy znać poszczególne cyfry (bity), a nie wartość całej liczby dwójkowej:
Linia 1. public static int konwertujBinDec otwórz nawias okrągły String liczbaBin zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. int wynik znak równości 0 średnik.
Linia 3. int waga znak równości 1 średnik.
Linia 4. int bit znak równości 0 średnik.
Linia 6. for otwórz nawias okrągły int i znak równości liczbaBin kropka length otwórz nawias okrągły zamknij nawias okrągły minus 1 średnik i zamknij nawias ostrokątny znak równości 0 średnik i minus minus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 7. bit znak równości Character kropka getNumericValue otwórz nawias okrągły liczbaBin kropka charAt otwórz nawias okrągły i zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 8. wynik znak równości wynik plus bit asterysk waga średnik.
Linia 9. waga znak równości waga asterysk 2 średnik.
Linia 10. zamknij nawias klamrowy.
Linia 12. return wynik średnik.
Linia 13. zamknij nawias klamrowy.
public static int konwertujBinDec(String liczbaBin) {
int wynik = 0;
int waga = 1;
int bit = 0;
for (int i = liczbaBin.length() - 1; i >= 0; i--) {
bit = Character.getNumericValue(liczbaBin.charAt(i));
wynik = wynik + bit * waga;
waga = waga * 2;
}
return wynik;
}
Omówmy poszczególne instrukcje.
W liniach 2., 3. oraz 4. deklarujemy trzy zmienne typu całkowitego: wynik, waga oraz bit:
wynik – rezultat przekształcenia liczby dwójkowej zwracany przez funkcję konwertujBinDec(); przechowuje ona wartość konwertowanej liczby w systemie dziesiętnym;
waga – przyjmuje wartości kolejnych wag bitów, czyli potęg liczby 2 (jako wartość początkową przypisujemy jej 1, ponieważ 2Indeks górny 00 = 1);
bit – przechowuje wartości kolejnych bitów zmiennej liczbaBin, uzyskane dzięki funkcji getNumericValue(), która służy do rzutowania zmiennej typu char na int.
Wewnątrz pętli for zapisujemy instrukcje służące do wyznaczenia wartości dziesiętnej liczby:
bit = Character.getNumericValue(liczbaBin.charAt(i)) – zamiana tekstu na wartość liczbową;
wynik = wynik + bit * waga – sumowanie kolejnych iloczynów częściowych;
waga = waga * 2 – obliczanie wagi następnego elementu (w wyniku mnożenia bieżącej wartości wagi przez 2).
Ostatnim krokiem jest wywołanie funkcji konwertujBinDec() i wyświetlenie wyniku:
Linia 1. System kropka out kropka println otwórz nawias okrągły cudzysłów Wynik dwukropek cudzysłów plus konwertujBinDec otwórz nawias okrągły liczbaTest zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 1. import Java kropka util kropka Scanner średnik.
Linia 3. public class Bin2Dec otwórz nawias klamrowy.
Linia 4. public static int konwertujBinDec otwórz nawias okrągły String liczbaBin zamknij nawias okrągły otwórz nawias klamrowy.
Linia 5. int wynik znak równości 0 średnik.
Linia 6. int waga znak równości 1 średnik.
Linia 7. int bit znak równości 0 średnik.
Linia 9. for otwórz nawias okrągły int i znak równości liczbaBin kropka length otwórz nawias okrągły zamknij nawias okrągły minus 1 średnik i zamknij nawias ostrokątny znak równości 0 średnik i minus minus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 10. bit znak równości Character kropka getNumericValue otwórz nawias okrągły liczbaBin kropka charAt otwórz nawias okrągły i zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 11. wynik znak równości wynik plus bit asterysk waga średnik.
Linia 12. waga znak równości waga asterysk 2 średnik.
Linia 13. zamknij nawias klamrowy.
Linia 15. return wynik średnik.
Linia 16. zamknij nawias klamrowy.
Linia 18. 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 19. String liczbaTest średnik.
Linia 21. Scanner Scanner znak równości new Scanner otwórz nawias okrągły System kropka in zamknij nawias okrągły średnik.
Linia 22. System kropka out kropka println otwórz nawias okrągły cudzysłów Podaj liczbę do przekonwertowania na system dzisiętny cudzysłów zamknij nawias okrągły średnik.
Linia 23. liczbaTest znak równości Scanner kropka nextLine otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 24. System kropka out kropka println otwórz nawias okrągły cudzysłów Wynik dwukropek cudzysłów plus konwertujBinDec otwórz nawias okrągły liczbaTest zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 25. zamknij nawias klamrowy.
Linia 26. zamknij nawias klamrowy.
import Java.util.Scanner;
public class Bin2Dec {
public static int konwertujBinDec(String liczbaBin) {
int wynik = 0;
int waga = 1;
int bit = 0;
for (int i = liczbaBin.length() - 1; i >= 0; i--) {
bit = Character.getNumericValue(liczbaBin.charAt(i));
wynik = wynik + bit * waga;
waga = waga * 2;
}
return wynik;
}
public static void main(String[] args) {
String liczbaTest;
Scanner Scanner = new Scanner(System.in);
System.out.println("Podaj liczbę do przekonwertowania na system dzisiętny");
liczbaTest = Scanner.nextLine();
System.out.println("Wynik: " + konwertujBinDec(liczbaTest));
}
}
Konwersja części ułamkowej z systemu dwójkowego do systemu dziesiętnego
Sposób przekształcania części ułamkowej liczby binarnej do postaci dziesiętnej jest bardzo podobny do tego, który przed chwilą zastosowaliśmy. Zmieniają się wartości wag odpowiadających każdej cyfrze dwójkowej. Są nimi: 2Indeks górny -1-1, 2Indeks górny -2-2, 2Indeks górny -3-3... , czyli odwrotności kolejnych potęg liczby 2. Przeciwny jest ponadto kierunek odczytywania bitów i obliczania iloczynów cząstkowych: posuwamy się od strony lewej do prawej.
Jeszcze raz dokonajmy konwersji, zajmując się częścią ułamkową liczby dwójkowej:
RtnEZTc2oLAf2
Ilustracja ukazuje konwersję liczby binarnej na dziesiętną. BIN: 10111 = 1 razy w do potęgi minus jeden + 0 razy 2 do potęgi minus dwa + 1 razy dwa do potęgi minus trzy + 1 razy dwa do potęgi minus cztery + = 0,5+0+0,125+0,0625=0,6875.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Mnożyliśmy bity (zaczynając po przecinku od strony lewej i kierując się ku prawej) przez wagi przypisane poszczególnym pozycjom, czyli kolejne odwrotności potęgi liczby 2 (pierwszą była 2Indeks górny -1-1). Po zsumowaniu iloczynów cząstkowych otrzymaliśmy ułamek zapisany w systemie dziesiętnym.
W kolejnej sekcji zaimplementujemy algorytm konwersji części ułamkowej z systemu dwójkowego do postaci dziesiętnej w języku Java.
Polecenie 1
Zapoznaj się z filmem. Przedstawiono w nim dwie metody konwersji liczby całkowitej zapisanej w systemie dwójkowym na postać dziesiętną. Pierwszą z nich już znasz, druga opiera się na schemacie Hornera.
R7RpCNWMHH1na
Film nawiązujący do algorytmu zmiany liczby bin na dec.
Film nawiązujący do algorytmu zmiany liczby bin na dec.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
element składni w określonym języku programowania, który w wyniku wywołania podprogramu zostaje utożsamiony (skojarzony) z określonym parametrem podprogramu
najmłodszy bit
najmłodszy bit
bit o najmniejszej wadze (najmniej istotny), zajmujący miejsce najdalej po prawej stronie liczby
parametr
parametr
element składni języka, który jest definiowany przy deklaracji metody lub funkcji; deklarujemy go w nagłówku podprogramu; umożliwia komunikację pomiędzy podprogramem (funkcją/metodą), a programem go wywołującym