R14NgwR0IvcLG
Zdjęcie przedstawia fragmenty linijek kodu zero‑jedynkowego zamieszczone na czarnym tle. Kod ma postać zielonych poziomych pasków.

I_P_W14_M09_Java Konwersja liczb z systemu dwójkowego na dziesiętny w języku Java

Źródło: Pixabay, domena publiczna.

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.

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 parametr 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 5. 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 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 ampersant gt średnik znak równości 0 średnik i minus minus zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. 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 7. wynik znak równości wynik plus bit asterysk waga średnik. Linia 8. waga znak równości waga asterysk 2 średnik. Linia 9. zamknij nawias klamrowy. Linia 11. return wynik średnik otwórz nawias ostrokątny prawy ukośnik code zamknij nawias ostrokątny. Linia 13. zamknij nawias klamrowy.

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 0 = 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.

A oto cały kod programu:

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 8. 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 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 ampersant gt średnik znak równości 0 średnik i minus minus zamknij nawias okrągły otwórz nawias klamrowy. Linia 9. 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 10. wynik znak równości wynik plus bit asterysk waga średnik. Linia 11. waga znak równości waga asterysk 2 średnik. Linia 12. zamknij nawias klamrowy. Linia 14. return wynik średnik. Linia 15. zamknij nawias klamrowy. Linia 17. 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 18. String liczbaTest średnik. Linia 20. Scanner Scanner znak równości new Scanner otwórz nawias okrągły System kropka in zamknij nawias okrągły średnik. Linia 21. 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 22. liczbaTest znak równości Scanner kropka nextLine otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 23. 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 24. zamknij nawias klamrowy otwórz nawias ostrokątny prawy ukośnik code zamknij nawias ostrokątny. Linia 26. zamknij nawias klamrowy.

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, 2Indeks górny -2, 2Indeks górny -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
Ź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). 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.
RykHmvzmcNSc3

Przycisk do pobrania pliku TXT z kodem źródłowym z filmu.

Plik TXT o rozmiarze 899.00 B w języku polskim

Słownik

argument
argument

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

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) w systemie dziesiętnym:

101112                        10

Oto rozwiązanie zadania:

RPvGb1TXAXyHV
Ź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 0, 2Indeks górny 1, 2Indeks górny 2, 2Indeks górny 3, 2Indeks górny 4... (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:

101112                  2310

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.

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 parametr 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 5. 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 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 ampersant gt średnik znak równości 0 średnik i minus minus zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. 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 7. wynik znak równości wynik plus bit asterysk waga średnik. Linia 8. waga znak równości waga asterysk 2 średnik. Linia 9. zamknij nawias klamrowy. Linia 11. return wynik średnik otwórz nawias ostrokątny prawy ukośnik code zamknij nawias ostrokątny. Linia 13. zamknij nawias klamrowy.

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 0 = 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.

A oto cały kod programu:

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 8. 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 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 ampersant gt średnik znak równości 0 średnik i minus minus zamknij nawias okrągły otwórz nawias klamrowy. Linia 9. 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 10. wynik znak równości wynik plus bit asterysk waga średnik. Linia 11. waga znak równości waga asterysk 2 średnik. Linia 12. zamknij nawias klamrowy. Linia 14. return wynik średnik. Linia 15. zamknij nawias klamrowy. Linia 17. 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 18. String liczbaTest średnik. Linia 20. Scanner Scanner znak równości new Scanner otwórz nawias okrągły System kropka in zamknij nawias okrągły średnik. Linia 21. 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 22. liczbaTest znak równości Scanner kropka nextLine otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 23. 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 24. zamknij nawias klamrowy otwórz nawias ostrokątny prawy ukośnik code zamknij nawias ostrokątny. Linia 26. zamknij nawias klamrowy.

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, 2Indeks górny -2, 2Indeks górny -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
Ź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). 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 2

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.
RykHmvzmcNSc3

Przycisk do pobrania pliku TXT z kodem źródłowym z filmu.

Plik TXT o rozmiarze 899.00 B w języku polskim

Słownik

argument
argument

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

Polecenie 3

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.