Převod čísla z dvojkové do desítkové soustavy v C++
Myslím, že vím jak na to, mám jen problém, že potřebuji změnit ASCII adresu (místo zvýrazněno) na normální znak (např. 48 na 0) a nevím jak, i po přetypování (int(něco) atd.) mi to počítá pořád se 48kou místo 0 :D
Kód vypadá takhle:
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
int main(){
cout << "Zadejte cislo ve dvojkove soustave: " << endl;
char vstup[80];
cin >> vstup;//otocene bin. cislo
int i = 0;
int vypis = 0;
while(vstup[i] != '\0'){
if (vstup[i] == '0' || vstup[i] == '1' ){
vypis = vypis + vstup[i]*pow(2.0,i);
++i;
}else{
cout << "Nespravny vstup." << endl;
return 0;
}
}
cout << vypis << endl;
return 0;
}
P.s.: Viděl jsem, že převody mezi číselnými sous. jdou provádět i pomocí bitového posunu - mohlis byste mi někdo, prosím, vysvětlit jak?
pomocí bitového posunu to uděláš tak, že uděláš cyklus od nuly s proměnnou "i" o 8 nebo 16 (příp. 32) iteracích který vezme binární číslo, udělá logický součet (AND) s binární jedničkou a vynásobí 2^i. Následně odrotuje vpravo. Konec cyklu.
tj. nějak takto:
Mohl bys to, prosím, trochu víc vysvětlit? A mrknout na ten příklad co mám já? Je to jednoduché (aspoň doufám :D), jen mi tam chybí nějaká ta typová konverze nebo tak něco, prostě to počítá s ASCII adresou místo hodnoty znaku...
vysvětlení máš v textu nad symbolickým zápisem, nic složitého na tom není (snad až na ten AND, který defacto udělá jen to, že "vynuluje" všechno až na první číslici zprava (proto pak můžeš násobit 2^i, protože budeš násobit 1 nebo 0)
Pro převod jednoho charu na číslo můžeš využít funkce Ord, která ti vrátí ASCII hodnotu znaku a odečíst od ní hodnotu 48 (ascii hodnota znaku nula), takže znak "0" bude mít hodnotu 0 a znak "1" hodnotu 1 (v ascii má jednička hodnotu 49).
edit: OMG! Ord je tuším z Práskalu, v C se to myslím dá přetypovat automaticky tak, že dáš int a = char nebo a = (int)char. Zbytek viz výše.
Načítavaš číslo po znakoch. Takže v nejakej premennej (vypis) máš aktuálne rozpoznanú hodnotu a pri každom načítaní ďalšieho znaku túto hodnotu vynásobíš základom sústavy (2) a pripočítaš hodnotu rozpoznanej číslice (vstup[i] - '0'):
Prípadne keď to chceš bitovým posunom, tak (ale predchádzajúci spôsob je čitateľnejší):
Všem moc díky, už to mám :D