String in Integer konvertieren (dezimal, binär, hexadezimal, oktal)

Wie man Strings in Zahlen und Zahlen in Strings in C++ konvertiert, habe ich bereits beschrieben. Jetzt möchte ich eine Lösung vorstellen, wie Strings in Integer ganz „per Hand“ umwandelt werden (Es war meine Hausaufgabenlösung in Informatik).

Um einen String in einen Integer umzuwandeln, lohnt es sich das ASCII-System auszunutzen. Das Prinzip ist ziemlich einfach: Man nimmt das erste char-Zeichen (was nichts anderes als eine Nummerierungszahl in der ASCII-Tabelle ist) und zieht davon die Position des Null-Zeichens ab. Damit bekommt man zu dem betrachteten Zeichen entsprechenden Integer-Wert, also aus ‚8‘ wird 8 usw.. Im nächsten Schritt wiederholt man die gleiche Prozedur mit dem nächsten Zeichen und der Wert, den man im letzten Schritt ausgerechnet hat, wird mit der Basis (für Dezimal: 10) multipliziert, so dass er eine Stelle nach links wandert. Das ganze wird wiederholt bis alle String-Zeichen durchlaufen sind.

// String (positive Ganzzahl) -> Integer
int myAtoi(const char* str)
{
	int res = 0;

	while(*str)
		res = res*10 + (*str++ - '0');	// Nutzt ASCII-System aus

	return res;
}

Eine weitere Version unterstützt noch andere Zahlensysteme:

// String (z.B. 0b110010010, 0o1163774, 0x01656E0F, 2234) -> Integer
// Annahme bei 0x-Zahlen: nur Großbuchstaben
int myAtoi(const char* str)
{
	int res = 0;
	const char* ch = str;

	switch(*++ch)
	{
		case 'b':	// binäre zahl
			while(*++ch)
				res = res*2 + (*ch - '0');
			break;

		case 'o':	// oktale zahl
			while(*++ch)
				res = res*8 + (*ch - '0');
			break;

		case 'x':	// hexadezimale zahl
			while(*++ch)
				res = res*16 + (('0' <= *ch && *ch <= '9') ? (*ch - '0') : (*ch - 'A'+ 10));
			break;

		default: // dezimale zahl
			while(*str)
				res = res*10 + (*str++ - '0');
	}

	return res;
}

Viel Spaß damit.

2 Gedanken zu „String in Integer konvertieren (dezimal, binär, hexadezimal, oktal)“

Schreibe einen Kommentar