Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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?

Předmět Autor Datum
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…
touchwood 23.10.2012 11:21
touchwood
Mohl bys to, prosím, trochu víc vysvětlit? A mrknout na ten příklad co mám já? Je to jednoduché (asp…
Katsushiro 23.10.2012 11:23
Katsushiro
vysvětlení máš v textu nad symbolickým zápisem, nic složitého na tom není (snad až na ten AND, který…
touchwood 23.10.2012 13:03
touchwood
Načítavaš číslo po znakoch. Takže v nejakej premennej (vypis) máš aktuálne rozpoznanú hodnotu a pri…
los 23.10.2012 12:33
los
Všem moc díky, už to mám :D poslední
Katsushiro 27.10.2012 18:52
Katsushiro

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:

cislo=10101010
deka=0
for i 0 to 7 
   deka = deka + ((cislo AND 1)* 2^i)
   ror (cislo)
next

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'):

vypis = 2 * vypis + vstup[i] - '0';

Prípadne keď to chceš bitovým posunom, tak (ale predchádzajúci spôsob je čitateľnejší):

vypis = vypis << 1 + vstup[i] - '0';

Zpět do poradny Odpovědět na původní otázku Nahoru