2013-02-14 106 views
8

我试图将几个二进制字符串转换回int。但是它不会转换我所有的二进制字符串,这让我产生了一个java.lang.NumberFormatException异常。 这里是我的测试代码3二进制字符串:java:将二进制字符串转换为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) ; 
    } 
} 

如果我转换“1010”它的伟大工程,但是当我尝试一个转换,另外两个我得到的异常。有人可以向我解释为什么这是吗?

干杯

+0

有人猜测,这是因为'Integer.toBinaryString'是无符号的,'Integer.parseInt'是有符号的。 – 2013-02-14 20:29:29

+3

你真的是指在这里“投”吗? – 2013-02-14 20:29:36

回答

4

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#toBinaryString(int)从:所述toBinaryString()方法其输入转换成的二进制表示“无符号整数值是参数加上2 如果参数为负”。

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#parseInt(java.lang.String,%20int):所述parseInt()方法抛出NumberFormatException如果“字符串所表示的值不是类型int值”。

注意,既~0~1为负(-1和-2分别地),所以-2分别将被转换成的2 -1和2的二进制表示,两者都不可以是以int类型的值表示,因此导致您看到的NumberFormatException

+0

那么我们如何解决这个问题呢? – TastyLemons 2015-08-17 12:06:48

+1

两年过去了,Java 8有一个'Integer.parseUnsignedInt'方法,可以很好地实现这个技巧,并让你回到'INPUT = 11111111111111111111111111111111 decimal = -1'(下面由Eddie在Java 8以前提到的“Long.parseLong” ) – 2015-08-17 13:59:18

1

“〜0”的位是11111111111111111111111111111111(32 1)。通常,这表示数字-1。 “〜1”的位是11111111111111111111111111111110(31 1后跟零)。通常,这表示数字-2。

我在parseInt中试过“01111111111111111111111111111111”(a 0和31 1),代表最高有符号整数,并且没有错误。但我试过“10000000000000000000000000000000”,它代表最小的有符号整数,并且再次出现错误。

parseInt方法似乎希望输入中的“ - ”表示需要负数。它看起来像这个方法检测整数溢出并抛出NumberFormatException

6

如上所述,Integer.toBinaryString()将〜0和〜1转换为无符号整型,以使它们超过Integer.MAX_VALUE。

您可以使用long来解析并转换回int,如下所示。

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()) ; 
} 
相关问题