Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: kymmen- ja binäärijärjestelmä

Cc [19.06.2006 13:19:25]

#

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ä.

os [19.06.2006 13:34:51]

#

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)

Metabolix [19.06.2006 14:03:08]

#

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...

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta