Zweierkomplement mit Java parsen

veröffentlicht am 22. Januar 2012

Ich hatte vor kurzem bei einem Projekt das Problem, ein so genanntes Zweierkomplement (Möglichkeit, um einen negativen Zahlenwert binär darzustellen) mit Java zu parsen. Leider scheint es dafür keine vorgefertigte Funktion zu geben, sodass ich mir selbst eine entsprechende Funktion schreiben musste.

Im Prinzip ist der Algorithmus kein Hexenwerk, dennoch dokumentiere ich die Funktion, vielleicht kann sie ja noch jemand gebrauchen.

public int parseSignedInt(final String binary) {
	final boolean minus = binary.charAt(0) == '1';
	final String value = binary.substring(1);
	if (minus) {
		return (int) -(Math.pow(2, value.length()) - Math.abs(Integer.parseInt(value, 2)));
	} else {
		return Integer.parseInt(value, 2);
	}
}

Kommentare

Du könntest auch die formale Umwandlung nutzen. Würde dann also irgendwie so aussehen:


if (minus) {
return (int) -(Math.pow(2, binary.length()) - Math.abs(Integer.parseInt(binary, 2)));
} else {
return Integer.parseInt(value);
}

Eine fertige Funktion kenne ich auch nicht :)

Kommentar #1 von Nils am 22. Januar 2012


Verdammte Axt, das klappt! Habe diese Methode bei Wikipedia ganz übersehen, werde das gleich morgen umbauen :)

Kommentar #2 von Patrick am 22. Januar 2012


Mhm, fehlt da im else Teil nicht der Radix?
Ansonsten könntest du dir auch das Erzeugen eines neuen Strings für den Check der führenden Eins sparen wenn du einfach charAt nehmen würdest *g*
„0“ + binary ist auch ungeschickt innerhalb des loops..
Als anderen Vorschlag zu dem was Nils zeigte, würde es wohl auch gehen, wenn du den String mit 1er auffüllst (32Bit) und dann mit Long.parseLong parst und zu einem int castest (int)Long.parseLong(sb.toString(), 2)
———-
public static int parseSignedInteger(final String binary) {
final boolean minus = binary.charAt(0) == ‚1‘;
if (minus) {
StringBuilder sb = new StringBuilder(binary);
while(sb.length() != 32){
sb.insert(0, ‚1‘);
}
return (int)Long.parseLong(sb.toString(), 2);
} else {
return Integer.parseInt(binary, 2);
}
}
———
?! Aber wirklich gefallen tut`s mir selbst auch nicht *g*

Kommentar #3 von Basti am 23. Januar 2012


Ich habe bereits die „formale Umwandlung“ implementiert und erfolgreich getestet. Heute Abend passe ich den Artikel entsprechend an, die Lösung stellt mich momentan zufrieden, auch wenn ich nicht verstehe, warum so eine Methode nicht in den Standardbibliotheken vorhanden ist.

Kommentar #4 von Patrick am 23. Januar 2012


Hinterlasse einen Kommentar