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」を変換するとうまくいきますが、他の2つのうちの1つを変換しようとすると例外が発生します。誰かが私にこれがなぜなのか説明できますか?

乾杯

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()メソッドは、その入力を「符号なし整数値は」のバイナリ表現に変換します。引数に負の場合は232を加えたもの"。

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#parseInt(java.lang.String,%20int)から:メソッドは次の場合にparseInt()スローします。文字列はタイプ"の値ではありません。NumberFormatExceptionint

~0とは両方とも負(それぞれ-1~1と-2)であるため、それぞれ232-1と232-2のバイナリ表現に変換されどちらもタイプの値で表すことができないintため、NumberFormatExceptionあなたが見ていること。

于 2013-02-14T20:37:15.600 に答える
1

「~0」のビットは 111111111111111111111111111111 (32 個の 1) です。通常、これは数値 -1 を表します。「~1」のビットは、111111111111111111111111111110 (31 個の 1 の後にゼロが続く) です。通常、これは数値 -2 を表します。

最大の符号付き整数を表す "0111111111111111111111111111111" (0 と 31 の 1) を試してみparseIntましたが、エラーはありませんでした。しかし、符号付き整数の最小値を表す「100000000000000000000000000000」を試してみたところ、またエラーが発生しました。

このparseIntメソッドは、負の数が必要であることを示すために、入力に「-」が含まれていることを期待しているようです。このメソッドは整数のオーバーフローを検出し、NumberFormatException.

于 2013-02-14T20:37:55.137 に答える