2013-02-14 14 views
8

Sto provando a convertire un paio di stringhe binarie in int. Tuttavia non converte tutte le mie stringhe binarie, lasciandomi un'eccezione java.lang.NumberFormatException. Ecco il mio codice di prova con 3 stringa binaria:java: converte stringa binary 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) ; 
    } 
} 

Se converto il "1010" funziona benissimo, ma quando provo a convertire uno degli altri due ottengo l'eccezione. Qualcuno può spiegarmi perché è così?

Acclamazioni

+0

Ad una ipotesi, è perché 'Integer.toBinaryString' non è firmato e' Integer.parseInt' è firmato. –

+3

Intendi davvero "cast" qui? –

risposta

4

Dalla http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#toBinaryString(int): il metodo toBinaryString() converte il suo ingresso nella rappresentazione binaria del "valore intero senza segno è l'argomento più 2 se l'argomento è negativo".

Da http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#parseInt(java.lang.String,%20int): il metodo parseInt() tiri NumberFormatException se "Il valore rappresentato dalla stringa non è un valore di tipo int".

noti che sia ~0 e ~1 sono negativi (-1 e -2 rispettivamente), così sarà convertito alle rappresentazioni binarie di 2 -1 e 2 -2 rispettivamente, nessuna delle quali può essere rappresentato in un valore di tipo int, causando così il NumberFormatException che stai vedendo.

+0

Quindi, come lo risolviamo? – TastyLemons

+1

Due anni dopo e Java 8 ha un metodo 'Integer.parseUnsignedInt' che farà bene il trucco e ti restituirà' INPUT = 11111111111111111111111111111111 decimal = -1' ('Long.parseLong' come accennato in seguito da Eddie funziona pre-Java 8) –

1

I bit per "~ 0" sono 11111111111111111111111111111111 (32 1 s). Normalmente, questo rappresenta il numero -1. I bit per "~ 1" sono 1111111111111111111111111111111110 (31 1 seguiti da uno zero). Normalmente, questo rappresenta il numero -2.

Ho provato "0111111111111111111111111111111111" (uno 0 e 31 1), che rappresenta il numero intero con segno più alto, in parseInt e non si è verificato alcun errore. Ma ho provato "10000000000000000000000000000000", che rappresenta il numero intero con segno minimo e c'è stato ancora l'errore.

Il metodo parseInt sembra prevedere un "-" nell'input per indicare che si desidera un numero negativo. Sembra che questo metodo rilevi l'overflow nel numero intero e il lancio dello NumberFormatException.

6

Come spiegato sopra, Integer.toBinaryString() converte ~ 0 e ~ 1 in unsigned int in modo che superino Integer.MAX_VALUE.

È possibile utilizzare molto tempo per analizzare e riconvertire in int come di seguito.

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()) ; 
}