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 | 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:
string 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;
}
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;
}
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;
}
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:
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.
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;
}
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;
}