C++ pozycyjne systemy liczbowe

dziesiątkowy na dwójkowy

Proces zamiany liczby dziesiętnej na dwójkowy wymaga zastosowania operacji reszty z dzielenia (mod) przez 2 do wyodrębnienia każdorazowo ostatniej cyfry oraz dzielenia całkowitego przez 2.

Obliczenia te należy kontynuować dopóty, dokóki liczba jest większa od zera.

98510 = 11 1101 10012
985 mod 2 = 1 strzalka 985 // 2 = 492
492 mod 2 = 0 492 // 2 = 246
246 mod 2 = 0 246 // 2 = 123
123 mod 2 = 1 123 // 2 = 61
61 mod 2 = 1 61 // 2 = 30
30 mod 2 = 0 30 // 2 = 15
15 mod 2 = 1 15 //2 = 7
7 mod 2 = 1 7 // 2 = 3
3 mod 2 = 1 3 // 2 = 1
1 mod 2 = 1 1 // 2 = 0
Odczytujem cyfry binarne od dołu, jak wskazuje strzałaka.

Na podstawie powyższego tworzymy algorytm:

  1. Utwórz zmienną wynik, której przypisz napis pusty string wynik="";
  2. Podaj liczbę w systemie dziesiątkowym.
  3. Dopóki liczba > 0 wykonuj
    • dopisz do wynik wartość liczba % 2
    • przypisz liczba wartość liczba // 2
  4. Wypisz wynik

Na podstawie powyższego algorytmu piszemy kod C++.

    #include <iostream>
    #include <string>
    
    using namespace std;
        
    int main() {
        int liczba, pom;
        string wynik = "";
            
        cout << "DEC 2 BIN \n\n";
        cout << "Podaj liczbe dziesietna: ";
        cin >> liczba;
        pom = liczba;
            
        while (liczba > 0) {
            wynik = to_string(liczba % 2) + wynik;
            liczba /= 2;
        }
        
        cout << "Liczba: " << pom << " to w systemie dwojkowym -> " << wynik << "\n\n";
        
        return 0;
    }

dziesiątkowy na ósemkowy

Proces zamiany liczby dziesiętnej na ósemkowy wymaga zastosowania operacji reszty z dzielenia (mod) przez 8 do wyodrębnienia każdorazowo ostatniej cyfry oraz dzielenia całkowitego przez 8.

Procedura jest zatem identyczna z poprzednią.
Zamieniamy jedynie 2 na 8.

    #include <iostream>
    #include <string>
    
    using namespace std;
        
    int main() {
        int liczba, pom;
        string wynik = "";
            
        cout << "DEC 2 OCT \n\n";
        cout << "Podaj liczbe dziesietna: ";
        cin >> liczba;
        pom = liczba;
            
        while (liczba > 0) {
            wynik = to_string(liczba % 8) + wynik;
            liczba /= 8;
        }
        
        cout << "Liczba: " << pom << " to w systemie ósemkowym -> " << wynik << "\n\n";
        
        return 0;
    }

dziesiątkowy na szesnastkowy

W systemie szesnastkowym reszta z dzielenia może być większa od 9.
Musimy zatem zastosować cyfry A, B, C, D, E, F, które będą odpowiadały resztom od 10 do 15.

W pierwszej wersji zastosujemy instrukcje warunkowe if(reszta == "10") reszta = "A";

#include <iostream>
#include <string>
                
using namespace std;

int main() {
    int liczba, sys, pom;
    string wynik = "";
    string zn;

    sys = 16;
    

    cout << "Podaj liczbe dziesietna: ";
    cin >> liczba;
    pom = liczba;

    
    while (liczba > 0) {
      zn =  to_string(liczba % sys);
      if(sys > 10){
          if(zn == "10") zn ="A";
          if(zn == "11") zn ="B";
          if(zn == "12") zn ="C";
          if(zn == "13") zn ="D";
          if(zn == "14") zn ="E";
          if(zn == "15") zn ="F";
      }
      wynik =  zn + wynik;
      liczba /= sys;
    }

    cout << "Liczba: " << pom << " to w systemie " << sys << " -> " << wynik << "\n\n";

    return 0;
}    

Inna metoda to zastosowanie wcześniej przygotowanej zmiennej tekstowej zawierającej cyfry liczby szesnastkowej:

string znaki = "0123456789ABCDEF";

#include <iostream>
#include <string>
        
        
using namespace std;

int main() {
    int liczba, sys, pom;
    string wynik = "";
    string znaki = "0123456789ABCDEF";

    sys = 16;
       
    cout << "Podaj liczbe dziesietna: ";
    cin >> liczba;
    pom = liczba;
    
    
    while (liczba > 0) {
      wynik = znaki[liczba % sys] + wynik; // pobieramy znak z pozycji liczba % sys
      liczba /= sys;
    }

    cout << "Liczba w dziesietna: " << pom << " w systemie " << sys << " to: " << wynik << "\n\n";

    return 0;
}

dwójkowy na dziesiątkowy

Liczbę binarną w postaci:
1011 1001
Można przeliczyć na system dziesiątkowy zgodnie z regułą:
1•27 + 0•26 + 1•25 + 1•24 + 1•23 + 0•22 + 0•21 + 1•20
po wykonaniu obliczeń otrzymamy 185

Algorytm przedstawia się następująco:

  1. Pobieramy liczbę binarną w postaci tekstu.
  2. Obliczamy ilość znaków liczby binarnej: dl = liczba.length();
  3. dla i=dl-1 do 0 (czyli od ostatniej pozycji liczby binarnej)
    • do sumy dodajemy ostatnią cyfrę pomnożoną przez 20
    • mnożymy poz przez 2 uzyskując 21
  4. Wyświetlamy wynik w postaci liczby dziesiętnej.

Realizujący to program C++

#include <iostream>
#include <string>
        
using namespace std;

int main () {
    string liczba=""; // wejściowa liczba binarna
    int dl;           // ilość znaków liczby binarnej
    int poz = 1;      // początkowa potęga systemu (tu 20)  
    int sum = 0;      // wartośc początkowa liczby dziesiętnej
    
    cout << "Podaj liczbe binarna: ";
    cin >> liczba;

    dl = liczba.length(); // obliczenie długości liczby binarnej

    for(int i=dl-1; i>=0; i--){
        sum += (liczba[i]-48)*poz;  // liczba[i] podaje kod ASCII znaku liczby binarnej, dla zera jest to 48.
        poz *= 2;                   // zwiększamy pozycję z 20 do 21, itd.
    }

    cout << "Liczba dec=" << sum << "\n\n"; // wyświetlamy liczbę dziesiątkową.
    
    return 0;
}    

Dla innego systemu zmieniamy 2 na podstawę systemu, dla ósemkowego na 8.

szesnastkowy na dziesiątkowy

Dla systemu szesnastkowego musimy uwzględnć cyfry A..F lub a..f
Kody ASCII cyfr to: 48 dla 0 do 57 dla 9

Dla cyfr "literowych" przedstawia się to następująco:

A 65 a 97
B 66 b 98
C 67 c 99
D 68 d 100
E 69 e 101
F 70 f 102

Do poprzedniej procedury musimy zatem dodać sprawdzanie, z jakim znakiem namy do czynienia.

zn = liczba[i];
// cyfry:
if(zn >= 48 && zn <= 57) zn -= 48;          // otrzymujemy od 0 do 9

// litery A..F
else if (zn >= 65 && zn <= 70) zn -= 55;    // otrzymujemy od 10 do 15

// litery a..f
else if (zn >= 97 && zn <= 102) zn -= 87;   // otrzymujemy od 10 do 15    

Nasza procedura przyjmuje postać:

#include <iostream>
#include <string>

using namespace std;
        
int main ()
{
    string liczba="";
    int zn, dl, poz = 1, sum = 0;

    cout << "Podaj liczbe w systemie hex: ";  cin >> liczba;
    dl = liczba.length();

    for(int i=dl-1; i>=0; i--){
        zn = liczba[i];
        if(zn >= 48 && zn <= 57) zn -= 48;
        else if (zn >= 65 && zn <= 70) zn -= 55;
        else if (zn >= 97 && zn <= 102) zn -= 87;
        else {
            cout << "Wprowadzono zla liczbe ";
            return 0;
        }       

        sum += zn*poz;
        poz *= 16;
  }

    cout << "Liczba " << liczba << " w systemie hex to dziesietnie " << sum << "\n\n";

  return 0;
}    


procedura z zastosowaniem zdefiniowanego łańcucha znaków

    int sys2dec(string liczbas, int sys) {
        int dl;
        int liczba = 0;
        int potega = 1;
        int cyfra;
        char znak;
        dl = liczbas.length();
        string znaki = "0123456789ABCDEF";
    
        for(int i=dl-1; i>=0; i--){
            znak = toupper(liczbas[i]);
            cyfra = znaki.find(znak);
            if(cyfra >= sys) return 0;
            liczba = liczba + cyfra*potega;
            potega = potega * sys;
        }
        return liczba;
    }
Projekt i wykonanie: Ryszard Rogacz© 1999−2024