2013-02-14 17 views
8

Tôi đang cố gắng chuyển đổi một vài chuỗi nhị phân trở lại int. Tuy nhiên, nó không chuyển đổi tất cả các chuỗi nhị phân của tôi, để lại cho tôi một ngoại lệ java.lang.NumberFormatException. Đây là mã thử nghiệm của tôi với 3 chuỗi nhị phân:java: chuyển đổi chuỗi nhị phân thành 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) ; 
    } 
} 

Nếu tôi chuyển đổi các "1010" nó hoạt động tuyệt vời, nhưng khi tôi cố gắng để chuyển đổi một trong hai người kia tôi nhận được ngoại lệ. Ai đó có thể giải thích cho tôi tại sao điều này?

Cheers

+0

Khi đoán, đó là vì 'Integer.toBinaryString' chưa được ký và' Integer.parseInt' được ký. –

+3

Bạn có thực sự có nghĩa là "đúc" ở đây? –

Trả lời

4

Từ http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#toBinaryString(int): phương pháp toBinaryString() chuyển đổi đầu vào của nó vào biểu diễn nhị phân của "giá trị số nguyên unsigned là lập luận cộng với 2 nếu đối số là tiêu cực".

Từ http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#parseInt(java.lang.String,%20int): phương pháp parseInt() ném NumberFormatException nếu "Giá trị đại diện bởi các chuỗi không phải là một giá trị kiểu int".

Lưu ý rằng cả hai ~0~1 là số âm (-1 và -2 tương ứng), như vậy sẽ được chuyển đổi sang cơ quan đại diện nhị phân của 2 -1 và 2 -2 tương ứng, không ai trong số đó có thể là được thể hiện bằng giá trị loại int, do đó, gây ra các số NumberFormatException mà bạn đang thấy.

+0

Vậy làm cách nào để khắc phục vấn đề này? – TastyLemons

+1

Hai năm sau và Java 8 có phương thức 'Integer.parseUnsignedInt' sẽ thực hiện thủ thuật độc đáo và trả lại cho bạn' INPUT = 11111111111111111111111111111111 decimal = -1' ('Long.parseLong' như được đề cập dưới đây bởi Eddie hoạt động trước Java 8) –

1

Các bit cho "~ 0" là 11111111111111111111111111111111 (32 1). Thông thường, điều này đại diện cho số -1. Các bit cho "~ 1" là 11111111111111111111111111111110 (31 1 được theo sau bởi một số không). Thông thường, điều này đại diện cho số -2.

Tôi đã thử "01111111111111111111111111111111" (số 0 và 31 1), đại diện cho số nguyên có chữ ký cao nhất, trong parseInt và không có lỗi. Nhưng tôi đã thử "10000000000000000000000000000000", đại diện cho số nguyên đã ký tối thiểu và đã xảy ra lỗi.

Phương thức parseInt dường như mong đợi "-" trong đầu vào để cho biết rằng số âm được mong muốn. Có vẻ như phương pháp này đang phát hiện tràn trong số nguyên và ném NumberFormatException.

6

Như đã giải thích ở trên, hàm Integer.toBinaryString() chuyển đổi ~ 0 và ~ 1 thành int không dấu sao cho chúng vượt quá Integer.MAX_VALUE.

Bạn có thể sử dụng lâu để phân tích cú pháp và chuyển đổi lại thành int như dưới đây.

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