[C++] Binär in Dezimal und zurück

dr-chiller

Cadet 4th Year
Registriert
Okt. 2004
Beiträge
98
Tach,

ich bin schon seit Tagen am werkeln an einem Umwandler von Binär nach Dezimal und von Dezimal nach Binär. Natürlich in 2 verschiedenen Dateien. Nur irgendwie bringe ich nix dolles zu stande, aktuell siehts so aus, aber das funktioniert nicht richtig.

binär_in_dezimal.cpp
Code:
#include "stdafx.h"
#include <math.h>
using namespace std;


int main(void)
{
char bin[40] = "";
int dez = 0;

cin >> bin;

for (int i = 0; bin[i]; i++)
{
if (!i && (bin[i] == '0' || bin[i] == '1'))
{
dez += (int) bin[i]-48;
}
else if (bin[i] == '0' || bin[i] == '1')
{
dez += pow(2*(bin[i]-48), i);
}
}
cout << dez;

return 0;
}

Für den anderen Weg habe ich noch nix machen können.

Wäre nett wenn ihr mir helfen könntet.
 
Das eine hab ich mal korrigiert. Schöner wärs natürlich, wenn du die pow(int, int) Methode noch selbst schreiben würdest.
Code:
#include "stdafx.h"
#include <math.h>
using namespace std;

int main(void)
{
	char bin[40] = "";
	int dez = 0;

	cin >> bin;
	for (int i = 0; i < (int)strlen((const char*)&bin);i++)
	{
		if ((bin[i] == '1') || (bin[i] == '0'))
			dez += (int)pow(2,((int)strlen((const char*)&bin) - 1 - i))*((int)bin[i]-48);
		else
		{
			cout << "Eingabe fehlerhaft" << endl;
			system("pause");
			return -1;
		}
	}
	cout << dez << endl;
	system("pause");
	return 0;
}
Bei dem anderen müsstest du mal sagen, wo deine Probleme liegen. Ich will nix unterstellen, aber wir sind nicht dazu da, deine Hausaufgaben zu machen.
 
@WingX: Wer solchen Code verbricht, gehört :stock: Und was soll das (const char*)&bin? Ist ziemlich überflüssig und verwirrt nur.

Code:
#include <iostream>
#include <string>
using namespace std;

int main(void)
{
	string bin;
	int dez = 0;

	cin >> bin;

	for (size_t i = 0, end = bin.size(); i != end; ++i)
	{
		char c = bin[i];
		if ((c == '1') || (c == '0')) {
			dez *= 2;
			dez += c - '0';
                }
		else
		{
			cout << "Eingabe fehlerhaft" << endl;
			system("pause");
			return 1;
		}
	}
	cout << dez << endl;
	system("pause");
	return 0;
}
 
Zuletzt bearbeitet:
Ist richtig, mit string geht das alles viel besser, aber weil es nun schon mir char array war, hab ich das weiter genutzt. Und hast du ne bessere Idee, strlen ein char array beizubiegen?
 
Öhm
Code:
char c [50] = "Hallo";
size_t len = strlen( c);
?

Das nennt sich array-to-pointer-conversion. Jeder lvalue von array von T lässt sich in einen rvalue von Zeiger auf T auf das erste Element des Arrays implizit umwandeln.
Hätte man auch mit strlen lösen können, dann würde aber ein strlen vor der for-Schleife reichen. So hat man durch jede Prüfung im Schleifenrumpf und durch jedes weitere strlen in der Funktion sinnlos vergeudete Rechenzeit, die auch noch von der Länge des Strings abhängt. Das wilde Hin-und-her-gecaste ist auch ziemlich unschön.
 
erstmal danke für eure Antworten, den hinweg also von Binär in Dezimal habe ich jetzt hinbekommen, nur beim Rückweg tun sich probleme auf.

Habt ihr ne idee wie das machen kann ?
 
von dezimal nach binäre? dann guck mal in den thread den arnd schon gepostet hatte. da findest du idee + 3 lösungen des problems in c (also drei verschiede wege, wobei arnds endgültige lösung an länge nur noch schwer schlagbar sein dürfte. ;-) ). mit ein wenig arbeit leicht nach c++ zu übersetzen.
 
Zuletzt bearbeitet:
ja aber das ist schon ein problem für mich, so gut kann ich c++ noch nicht, dass ich es von c umwandeln kann.
 
also du hast diesen c code (ist meine lösung des problems. arnds ist zwar kürzer, aber nicht so leicht zu verstehen. finde ich zu mindet)
Code:
char binzahl[33]; //da c nett ist, ist das feld mit 0 initialisiert. brauchen wir eigentlich nur für die nullterminierung.

//die eigentliche umwandlung
int pos=0;
//feld zurücksetzen
for (pos=0;pos<32;pos++)
binzahl[pos]='0';
pos=0;
//um jetzt den algo drüber zu jagen.
while (dez!=0)
{
     binzahl[32-pos]='0'+dez % 2;
     dez=dez / 2;
     pos++;
}
printf("%s\n",binzahl);

so zu erst schmeiße man das char-feld raus, dass kann man in c++ besser mit einem string lösen, printf wird durch cout ersetzt und fertig ist der code.

Code:
#include <iostream>
#include <string>
[...]

[...]
//die eigentliche umwandlung
string binzahl; //wird brauchen hier keine feste größe vorzugeben und auch keine 
//nullterminierung durch zu führen

int pos=0;
while (dez!=0)
{
     binzahl.insert(0,1,'0'+(char)(dez % 2));//fügt einen character an der nullten stelle, also ganz vorne, ein.
     //es wäre effizienter ihn hinten anzufügen und am ende den string umzudrehen, 
     //da es hierfür aber keine stl-funktion gibt, verzichte aus gründen der übersichtlichekt 
     //hier mal darauf.
     dez=dez / 2;
     pos++;
}
cout << binzahl << endl;
[...]
 
Zuletzt bearbeitet:
Zurück
Oben