Realizacja algorytmu w języku C++

Do napisania w języku C++ programu przekształcającego liczbę szesnastkową do postaci binarnej wykorzystamy dwuetapowy algorytm omówiony w e‑materiale Konwersja liczb z systemu szesnastkowego na binarnyPWE3t8GeyKonwersja liczb z systemu szesnastkowego na binarny.

Zacznijmy od zdefiniowania funkcji hex2Dec(), która dokona konwersji liczby szesnastkowej do postaci dziesiętnej:

Linia 1. int hex2Dec otwórz nawias okrągły string liczba podkreślnik hex zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. int wynik znak równości 0 średnik. Linia 3. int cyfra podkreślnik hex znak równości 0 średnik. Linia 4. int waga znak równości 1 średnik. Linia 6. for otwórz nawias okrągły int i znak równości liczba podkreślnik hex 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. cyfra podkreślnik hex znak równości liczba podkreślnik hex otwórz nawias kwadratowy i zamknij nawias kwadratowy średnik. Linia 9. if otwórz nawias okrągły liczba podkreślnik hex otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny znak równości apostrof 0 apostrof ampersant ampersant liczba podkreślnik hex otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias ostrokątny znak równości apostrof 9 apostrof zamknij nawias okrągły otwórz nawias klamrowy. Linia 10. cyfra podkreślnik hex znak równości liczba podkreślnik hex otwórz nawias kwadratowy i zamknij nawias kwadratowy minus apostrof 0 apostrof średnik. Linia 11. zamknij nawias klamrowy else if otwórz nawias okrągły liczba podkreślnik hex otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny znak równości apostrof A apostrof ampersant ampersant liczba podkreślnik hex otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias ostrokątny znak równości apostrof F apostrof zamknij nawias okrągły otwórz nawias klamrowy. Linia 12. cyfra podkreślnik hex znak równości liczba podkreślnik hex otwórz nawias kwadratowy i zamknij nawias kwadratowy minus 55 średnik. Linia 13. zamknij nawias klamrowy. Linia 15. wynik znak równości wynik plus cyfra podkreślnik hex asterysk waga średnik. Linia 16. waga znak równości waga asterysk 16 średnik. Linia 17. zamknij nawias klamrowy. Linia 19. return wynik średnik. Linia 20. zamknij nawias klamrowy.

W programie deklarujemy trzy zmienne typu całkowitego:

  • wynik – suma obliczonych iloczynów częściowych,

  • cyfra_hex – zmienna przechowująca kolejne cyfry przekształcanej liczby,

  • waga – kolejne potęgi liczby 16, odpowiadające wagom poszczególnych cyfr liczby szesnastkowej.

Zmienna waga na początku ma wartość 1, ponieważ najmłodszemu symbolowi odpowiada waga 160 (czyli 1).

W pętli for kolejne cyfry szesnastkowe, zaczynając od najmniej znaczącej, będą mnożone przez wagi odpowiadające ich pozycji. ParametremparametrParametrem funkcji jest zmienna typu string, czyli tekst zawierający liczbę szesnastkową.

Trzeba zatem znaleźć sposób przekształcenia kolejnych cyfr liczby szesnastkowej na odpowiadające im wartości liczbowe w systemie szesnastkowym.

Skorzystamy z instrukcji warunkowej if, aby sprawdzić, czy odczytywana cyfra liczby szesnastkowej należy do zbioru cyfr (od 0 do 9), czy też liter (od A do F). Najpierw zapiszmy poniższy warunek.

Linia 1. if otwórz nawias okrągły liczba podkreślnik hex otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny znak równości apostrof 0 apostrof ampersant ampersant liczba podkreślnik hex otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias ostrokątny znak równości apostrof 9 apostrof zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. cyfra podkreślnik hex znak równości liczba podkreślnik hex otwórz nawias kwadratowy i zamknij nawias kwadratowy minus apostrof 0 apostrof średnik.

Sprawdza on, czy zmienna liczba_hex[i] zawiera znaki ASCII odpowiadające cyfrom ('0', '1', '2', ... '9'). Jeśli tak, to w zmiennej cyfra_hex (typu int) zapisujemy liczbę odpowiadającą kodowi ASCII znaku cyfry, odejmując od niej kod ASCII znaku zera (wynosi on 48). W rezultacie zmienna cyfra_hex przyjmie wartość od 0 do 9.

Przykład 1

Jeżeli liczba_hex[i] będzie znakiem „6”, zostanie wykonane działanie 54-48, czyli zmienna cyfra_hex przyjmie wartość 6; gdy liczba_hex[i] będzie znakiem „0”, zostanie obliczona różnica 48-48, więc cyfra_hex przyjmie wartość 0.

Rozpatrzmy teraz drugi przypadek, kiedy sprawdzany znak nie będzie cyfrą, lecz literą (od A do F). Wtedy od zmiennej liczba_hex[i] trzeba odjąć liczbę 55. Dlaczego właśnie tyle? Otóż symbole literowe ze zbioru A, , F mają przyporządkowane w kodzie ASCII wartości od 65 do 70. Po odjęciu od nich liczby 55 otrzymamy dziesiętne odpowiedniki cyfr szesnastkowych.

Przykład 2

Znakowi „C” w  kodzie ASCII odpowiada liczba 67. Jeżeli odejmiemy od niej 55, uzyskamy wynik 12, czyli dziesiętną wartość C16.

Uzupełniamy zatem instrukcję if:

Linia 1. else if otwórz nawias okrągły liczba podkreślnik hex otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny znak równości apostrof A apostrof ampersant ampersant liczba podkreślnik hex otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias ostrokątny znak równości apostrof F apostrof zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. cyfra podkreślnik hex znak równości liczba podkreślnik hex otwórz nawias kwadratowy i zamknij nawias kwadratowy minus 55 średnik. Linia 3. zamknij nawias klamrowy.

Następnym etapem jest zdefiniowanie funkcji dec2Bin(), która posłuży do przekształcenia liczby dziesiętnej do systemu binarnego. Funkcja ta zwraca łańcuch znaków (string) – reprezentację binarną liczby:

Linia 1. string dec2Bin otwórz nawias okrągły int liczba podkreślnik dec zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. string liczba podkreślnik bin znak równości cudzysłów cudzysłów średnik. Linia 3. int reszta znak równości 0 średnik. Linia 5. while otwórz nawias okrągły liczba podkreślnik dec zamknij nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. reszta znak równości liczba podkreślnik dec procent 2 średnik. Linia 7. liczba podkreślnik dec znak równości liczba podkreślnik dec prawy ukośnik 2 średnik. Linia 8. liczba podkreślnik bin znak równości to podkreślnik string otwórz nawias okrągły reszta zamknij nawias okrągły plus liczba podkreślnik bin średnik. Linia 9. zamknij nawias klamrowy. Linia 11. return liczba podkreślnik bin średnik. Linia 12. zamknij nawias klamrowy.

Konwersji dokonujemy poprzez konkatenację zmiennej liczba_bin i kolejnych reszt z dzielenia liczby dziesiętnej przez 2. Aby móc wykonać konkatenację zmiennej liczba_bin typu string oraz liczby całkowitej reszta, używamy funkcji wbudowanej to_string(), która dla liczby int zwraca jej tekstową reprezentację (string).

Oto pełny kod programu realizującego konwersję liczby szesnastkowej do postaci binarnej:

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 2. kratka include otwórz nawias ostrokątny string zamknij nawias ostrokątny. Linia 3. using namespace std średnik. Linia 5. int hex2Dec otwórz nawias okrągły string liczba podkreślnik hex zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. int wynik znak równości 0 średnik. Linia 7. int cyfra podkreślnik hex znak równości 0 średnik. Linia 8. int waga znak równości 1 średnik. Linia 10. for otwórz nawias okrągły int i znak równości liczba podkreślnik hex 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 11. cyfra podkreślnik hex znak równości liczba podkreślnik hex otwórz nawias kwadratowy i zamknij nawias kwadratowy średnik. Linia 13. if otwórz nawias okrągły liczba podkreślnik hex otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny znak równości apostrof 0 apostrof ampersant ampersant liczba podkreślnik hex otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias ostrokątny znak równości apostrof 9 apostrof zamknij nawias okrągły otwórz nawias klamrowy. Linia 14. cyfra podkreślnik hex znak równości liczba podkreślnik hex otwórz nawias kwadratowy i zamknij nawias kwadratowy minus apostrof 0 apostrof średnik. Linia 15. zamknij nawias klamrowy else if otwórz nawias okrągły liczba podkreślnik hex otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny znak równości apostrof A apostrof ampersant ampersant liczba podkreślnik hex otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias ostrokątny znak równości apostrof F apostrof zamknij nawias okrągły otwórz nawias klamrowy. Linia 16. cyfra podkreślnik hex znak równości liczba podkreślnik hex otwórz nawias kwadratowy i zamknij nawias kwadratowy minus 55 średnik. Linia 17. zamknij nawias klamrowy. Linia 19. wynik znak równości wynik plus cyfra podkreślnik hex asterysk waga średnik. Linia 20. waga znak równości waga asterysk 16 średnik. Linia 21. zamknij nawias klamrowy. Linia 23. return wynik średnik. Linia 24. zamknij nawias klamrowy. Linia 26. string dec2Bin otwórz nawias okrągły int liczba podkreślnik dec zamknij nawias okrągły otwórz nawias klamrowy. Linia 27. string liczba podkreślnik bin znak równości cudzysłów cudzysłów średnik. Linia 28. int reszta znak równości 0 średnik. Linia 30. while otwórz nawias okrągły liczba podkreślnik dec zamknij nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 31. reszta znak równości liczba podkreślnik dec procent 2 średnik. Linia 32. liczba podkreślnik dec znak równości liczba podkreślnik dec prawy ukośnik 2 średnik. Linia 33. liczba podkreślnik bin znak równości to podkreślnik string otwórz nawias okrągły reszta zamknij nawias okrągły plus liczba podkreślnik bin średnik. Linia 34. zamknij nawias klamrowy. Linia 36. return liczba podkreślnik bin średnik. Linia 37. zamknij nawias klamrowy. Linia 40. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 41. string liczba podkreślnik test znak równości cudzysłów 1A cudzysłów średnik. Linia 43. cout otwórz nawias ostrokątny otwórz nawias ostrokątny hex2Dec otwórz nawias okrągły liczba podkreślnik test zamknij nawias okrągły otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 44. int liczbaDec znak równości hex2Dec otwórz nawias okrągły liczba podkreślnik test zamknij nawias okrągły średnik. Linia 45. cout otwórz nawias ostrokątny otwórz nawias ostrokątny dec2Bin otwórz nawias okrągły liczbaDec zamknij nawias okrągły średnik. Linia 47. return 0 średnik. Linia 48. zamknij nawias klamrowy.

Pozostałe materiały z serii

Słownik

argument
argument

konkretna wartość przekazywana do funkcji lub metody, przy jej wywołaniu

parametr
parametr

element składni w określonym języku programowania umożliwiający komunikację pomiędzy podprogramem wywołanym a programem wywołującym; parametry określa się wraz z deklaracją określonego podprogramu w jego nagłówku