olen tässä tekemässä ohjelmaa joka muuttaa kymmenjärjestelmäisen luvun sitä vastaavaan binäärijärjestelmän lukuun. Olen jopa puoliksi onnistunnut tässä projektissa eli osaan muuttaa kymmenjärjestelmästä binäärijärjestelmään, mutta kun yritän toisinpäin niin luvut eivät täsmää.. missäköhän voisi olla vika?
string muutettava; int tulos; cout << endl << "Anna muutettava binääriluku:" << endl; cin >> muutettava; tulos = muutettava[9] * pow(2,9) + muutettava[8] * pow(2,8) + muutettava[7] * pow(2,7) + muutettava[6] * pow(2,6) + muutettava[5] * pow(2,5) + muutettava[4] * pow(2,4) + muutettava[3] * pow(2,3) + muutettava[2] * pow(2,2) + muutettava[1] * pow(2,1) + muutettava[0] * pow(2,0); cout << "Binääriluvun "; for(int i = 0; i < 10; i++) { cout << muutettava[i]; } cout << " kymmenluku on " << tulos << endl;
tuossa on ohjelmani koodi, jonka pitäisi muuttaa binäärijärjestelmästä kymmenjärjestelmään luku, mutta siinä on jotain bugeja, jota minä en tajua... Kiitos avusta.
PS: miten saan ääkköset konsoliin kun tuo ä näkyy konsolissa
jonain ihme o:na jossa on ~ merkki sen päällä.
Taitaa toimia vain, jos käyttäjän syöttämässä muutettava
:ssa on tasan kymmenen numeroa. Luvut (myös binääriluvut) on tapana ilmaista siten, että vähiten merkitsevä numero on luvussa oikealla. Koodisi käsittelee lukua siten, että vähiten merkitsevä bitti on vasemmalla (muutettava[0]
). Kannattaisi varmaankin ensin katsoa, kuinka monta numeroa käyttäjän syöttämässä luvussa on ja laskea tulos sen mukaan.
Ja vielä: pow
palauttaa liukuluvun, joka pitäisi muuntaa kokonaisluvuksi: (int)pow(2,x)
. Jos muunlaisessa sovelluksessa tarvittaisiin lisää nopeutta (pow
on erittäin hidas), 2^x -kuvaus hoituu C:ssä näppärästi << - eli bittisiirto-operaattorilla:
pow(2,x) = (1 << x)
Ei kannata taaskaan kirjoittaa kaikkea tuolla tavalla auki. Tässä nyt esimerkki muunnoksista binaarijärjestelmään kirjoitetusta tekstistä int-muuttujaan ja siitä kahdeksan- ja kuusitoistajärjestelmiin:
std::string bin_str, hex_str, oct_str; unsigned int Luku; unsigned int Oct, Hex; unsigned int Maski; int i; std::cout << "Anna luku: "; std::cin >> bin_str; // Joka bitin kohdalla aina kerrotaan luku kahdella (<< 1) ja lisätään uusin bitti for (Luku = i = 0; i < bin_str.length(); ++i) { Luku = (Luku << 1) + (bin_str[i] == '1' ? 1 : 0); } std::cout << "10-j. " << Luku << std::endl; // 16-järjestelmään otetaan muuttujasta aina neljä bittiä oikeasta kohti for (i = 0; 16 << i < Luku; i += 4); for (Maski = 0x0f; i >= 0; i -= 4) { Hex = (Luku >> i) & Maski; hex_str += (char)((Hex < 10) ? (Hex + '0') : (Hex - 10 + 'a')); } std::cout << "16-j. " << hex_str << std::endl; // 8-järjestelmään otetaan muuttujasta aina kolme bittiä oikeasta kohti for (i = 0; 8 << i < Luku; i += 3); for (Maski = 07; i >= 0; i -= 3) { Oct = (Luku >> i) & Maski; oct_str += (char)(Oct + '0'); } std::cout << " 8-j. " << oct_str << std::endl;
Tuolla olisi ollut toinen aivan vastaava aihe meneillään...
Aihe on jo aika vanha, joten et voi enää vastata siihen.