9

我正在尝试将几个二进制字符串转换回 int。但是它不会转换我所有的二进制字符串,给我留下一个java.lang.NumberFormatException异常。这是我的带有 3 个二进制字符串的测试代码:

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”效果很好,但是当我尝试转换另外两个之一时,我得到了异常。有人可以向我解释这是为什么吗?

干杯

4

4 回答 4

6

如上所述,Integer.toBinaryString() 将 ~0 和 ~1 转换为 unsigned int,因此它们将超过 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()) ;
}
于 2013-02-14T21:35:51.327 回答
5

来自http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#toBinaryString(int):该toBinaryString()方法将其输入转换为“无符号整数值的二进制表示如果参数为负,则参数加 2 32 "。

来自http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#parseInt(java.lang.String,%20int):该parseInt()方法抛出NumberFormatExceptionif "所代表的值该字符串不是int“类型的值。

注意~0~1都是负数(分别为 -1 和 -2),因此将分别转换为 2 32 -1 和 2 32 -2 的二进制表示,两者都不能用 type 的值表示int,因此导致NumberFormatException你所看到的。

于 2013-02-14T20:37:15.600 回答
1

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

我尝试了“01111111111111111111111111111111”(0 和 31 个 1),它代表最高的有符号整数,parseInt没有错误。但是我试了“10000000000000000000000000000000”,代表最小有符号整数,又报错了。

parseInt方法似乎期望输入中的“-”表示需要负数。看起来此方法正在检测整数中的溢出并抛出NumberFormatException.

于 2013-02-14T20:37:55.137 回答
1

在此处添加所有四种更新的方法和比较,以便于理解

public static void binary() {

    // Gives magnitude in binary along with sign for negative values
    System.out.println(Integer.toString(-1,2)); // -1
    // Give the int value of input binary representation along with sign
    System.out.println(Integer.parseInt(Integer.toString(-1, 2),2)); // -1

    // Gives signed binary representation of input value
    System.out.println(Integer.toBinaryString(-1)); // 11111111111111111111111111111111
    // Gives the integer value of signed binary number
    System.out.println(Integer.parseUnsignedInt(Integer.toBinaryString(-1), 2)); // -1
}
于 2021-04-30T11:01:09.247 回答