2013-02-14 20 views
8
konvertieren

Ich versuche, ein paar binäre Zeichenfolgen zurück in int zu konvertieren. Es konvertiert jedoch nicht alle meine binären Zeichenfolgen und lässt mich eine java.lang.NumberFormatException Ausnahme. Hier ist mein Test-Code mit 3 Binärkette:java: binäre Zeichenfolge in int

public class Bin { 

    public static void main(String argvs[]) { 
      String binaryString ; 
      binaryString = Integer.toBinaryString(~0); 
      //binaryString = Integer.toBinaryString(~1); 
      //binaryString = "1010" ; 
      int base = 2; 
      int decimal = Integer.parseInt(binaryString, base); 
      System.out.println("INPUT=" + binaryString + " decimal=" + decimal) ; 
    } 
} 

Wenn ich die „1010“ es funktioniert super konvertieren, aber wenn ich versuche, eine der beiden anderen zu konvertieren bekomme ich die Ausnahme. Kann mir jemand erklären, warum das so ist?

Prost

+0

Bei einer Schätzung ist es, weil "Integer.toBinaryString" unsigned ist und "Integer.parseInt" signiert ist. –

+3

Meinst du wirklich "Besetzung" hier? –

Antwort

4

Von http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#toBinaryString(int): die toBinaryString() Verfahren wandelt seine Eingabe in die Binärdarstellung des "unsigned integer-Wert ist das Argument plus 2 wenn das Argument negativ ist".

Von http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#parseInt(java.lang.String,%20int): die parseInt() Methode löst NumberFormatException wenn „Der durch den String dargestellte Wert ist kein Wert vom Typ ist int“.

beachte, dass beide ~0~1 und sind negativ (-1 und -2 bezeichnet), so wird auf die binären Darstellungen der 2 -1 und 2 -2 bzw. umgewandelt werden können, von denen keiner sein in einem Wert des Typs int dargestellt, so verursacht die NumberFormatException, die Sie sehen.

+0

Also, wie reparieren wir das? – TastyLemons

+1

Zwei Jahre später und Java 8 hat eine 'Integer.parseUnsignedInt' Methode, die den Trick richtig macht und dir' INPUT = 11111111111111111111111111111111 decimal = -1' zurückgibt ('Long.parseLong' wie unten von Eddie erwähnt, arbeitet vor Java 8)) –

1

Die Bits für "~ 0" sind 11111111111111111111111111111111 (32 1). Normalerweise entspricht dies der Zahl -1. Die Bits für "~ 1" sind 1111111111111111111111111111111110 (31 1 gefolgt von einer Null). Normalerweise entspricht dies der Zahl -2.

Ich versuchte "01111111111111111111111111111111" (a 0 und 31 1), die die höchste vorzeichenbehaftete ganze Zahl darstellt, in parseInt und es gab keinen Fehler. Aber ich habe versucht "1000000000000000000000000000000000", die die minimale vorzeichenbehaftete Ganzzahl darstellt, und es gab den Fehler erneut.

Die Methode parseInt scheint mit einem "-" in der Eingabe zu erwarten, dass eine negative Zahl gewünscht wird. Es sieht so aus, als ob diese Methode einen Überlauf in der Ganzzahl erkennt und die NumberFormatException auslöst.

6

Wie oben erläutert, konvertiert Integer.toBinaryString() ~ 0 und ~ 1 in unsigned int, so dass sie Integer.MAX_VALUE überschreiten.

Sie könnten long zum parsen und konvertieren zurück zu int wie folgt verwenden.

int base = 2; 
for (Integer num : new Integer[] {~0, ~1}) { 
    String binaryString = Integer.toBinaryString(num);    
    Long decimal = Long.parseLong(binaryString, base); 
    System.out.println("INPUT=" + binaryString + " decimal=" + decimal.intValue()) ; 
}