I_P_W14_M08_C++ Konwersja liczb z systemu dwójkowego na dziesiętny w języku C++
Zanim przystąpimy do implementacji algorytmu konwersji liczb z systemu dwójkowego na dziesiętny, przypomnijmy, w jaki sposób dokonywane jest takie przekształcenie. Przeanalizujmy przykład zamiany liczby zapisanej w systemie dwójkowym (binarnym) na system dziesiętny, czyli o podstawie . Ułatwi to późniejsze zaimplementowanie algorytmu w języku C++.
Dokonamy konwersji liczby z systemu dwójkowego na dziesiętny.
Jak rozwiązalibyśmy to zadanie, gdybyśmy mieli do dyspozycji kartkę i długopis?

Konwersja polega na mnożeniu kolejnych bitów (zaczynając od najmłodszego bitunajmłodszego bitu i kończąc na najstarszym bicienajstarszym bicie) przez wagę pozycji, czyli kolejne potęgi liczby (zaczynając od potęgi zerowej). Po zsumowaniu iloczynów częściowych otrzymamy wynik – liczbę zapisaną w systemie dziesiętnym.
Oto wynik końcowy wraz z odpowiednim zapisem:
Komputerowa realizacja w języku C++
Teraz zastanówmy się, jak zaimplementować omówiony algorytm przy użyciu języka programowania C++.
Algorytm zamiany liczby z systemu binarnego na system dziesiętny zapiszemy w ciele funkcji o nazwie konwertujBinDec(). Zwróci ona zmienną typu całkowitego (int) – będzie to liczba przekształcona do postaci dziesiętnej. Jako argument funkcja przyjmie liczbę zapisaną w systemie binarnym i przechowywaną w zmiennej typu string liczbaBin. Dlaczego użyjemy zmiennej typu string? W tym przypadku łatwiej będzie użyć właśnie tego typu zmiennej – podczas konwersji potrzebna jest znajomość wartości liczbowych poszczególnych cyfr, nie zaś całej liczby.
W przypadku operowania na zmiennych typu string pamiętajmy o użyciu odpowiedniej biblioteki:
Następnie zadeklarujmy kilka zmiennych:
int wynik– zmienna, w której będziemy sumować kolejne iloczyny częściowe powstałe wskutek mnożenia wag przez bity. Będzie to wartość zwracana przez funkcjękonwertujBinDec(),int waga– będzie przyjmować kolejne wagi bitów, czyli kolejne potęgi liczby ,int bit– do niej zapiszemy konkretny bit konwertowanej liczby.
Zmienna waga na początku przyjmuje wartość , ponieważ wagą najmłodszego bitu jest , czyli .
Napiszmy teraz pętlę typu for, w której kolejne bity, zaczynając od najmłodszego, będą mnożone przez odpowiadające im wagi.
Omówmy teraz poszczególne fragmenty kodu.
int bit = liczbaBin[i] - '0'→ w zmiennej typuintzapisujemy zmienną typustringi odejmujemy od niej liczbę odpowiadającą w kodzie ASCII znakowi zera. Dzięki temu w zmiennejbitzostaje zapisana liczba lub . ZmiennaliczbaBin[i]w kodzie ASCII to znak '' lub '' (ponieważ tylko takie liczby mogą pojawić się w systemie binarnym), a odpowiadające tym znakom liczby to, kolejno, i . Oznacza to, że jeżeliliczbaBin[i]będzie znakiem '', zostanie wykonane działanie , czyli zmiennabinprzyjmie wartość liczbową . Jeżeli natomiastliczbaBin[i]będzie znakiem '', wykonane zostanie działanie , a zmiennabinprzyjmie wartość liczbową ,wynik = wynik + bit * waga→ dodajemy kolejne iloczyny częściowe,waga = waga * 2→ aby uzyskać wagę kolejnej pozycji, mnożymy aktualną wagę razy podstawę systemu, czyli .
Napiszmy kod, który umożliwi użytkownikowi wpisanie własnej liczby w celu wykonania konwersji do systemu dziesiętnego. Skorzystamy ze strumienia cin. Przeanalizujmy poniższy fragment kodu:
Oczywiście musimy zadeklarować zmienną liczbaTest, do której zapisana zostanie informacja podana przez użytkownika.
Kolejnym krokiem będzie wywołanie funkcji konwertujBinDec() dla argumentu liczbaTest i wypisanie wyniku (czyli liczby przekształconej do postaci dziesiętnej). W tym przypadku posłużymy się strumieniem cout.
Oto kod całego programu:
Konwersja części ułamkowej
Konwersja części ułamkowej z systemu binarnego na dziesiętny przebiega bardzo podobnie do przekształcania części całkowitej. Mnożymy kolejne bity przez wagi pozycji, jednak tym razem są one kolejnymi potęgami odwrotności podstawy systemu, czyli liczby .
Posłużmy się przykładem:

Mnożymy kolejne bity (zaczynając od bitu umieszczonego skrajnie po lewej stronie) przez wagę pozycji, czyli przez kolejne odwrotności potęgi liczby (zaczynając od ). Następnie sumujemy iloczyny częściowe. Tak otrzymany wynik jest ułamkiem zapisanym w systemie dziesiętnym.
Słownik
bit o najmniejszej wadze, najbardziej wysunięty na prawo
bit o największej wadze, najbardziej wysunięty na lewo