1

基数 10 の数値を基数 2 に変換し、基数 10 に戻そうとしています。正の argument_decimal に対してのみ機能します。

argument_binary = Integer.toBinaryString(argument_decimal);
back_converted_argument_decimal = Integer.valueOf(argument_binary, 2);

argument_decimal が負の場合、「java.lang.NumberFormatException: For input string: "1111111111111111111111111111111"」というメッセージが表示されます

編集:これが私がすることです:

latitude_binary = Integer.toBinaryString((int)(latitude_decimal * 1000000));   
back_converted_latitude_decimal =  Long.parseLong(latitude_binary, 2) / 1000000.0;

-1.1 が前後に 4293.867296 に変換されるなどの悪い結果が得られます

4

2 に答える 2

6

long を経由してみてください:

String binary = Integer.toBinaryString(-1);
long l = Long.parseLong(binary, 2);
int i = (int) l;

テスト済み、動作中。

これが機能する理由は、-1 がシステム メモリ内の 32 ビット 1 のシーケンスとして表されるためです。toBinaryString メソッドを使用すると、その正確な表現を使用して文字列が作成されます。しかし、1 の 32 ビットは実際には 2^32 - 1 に等しくなります。int は [-2^31, 2^31-1] から移動するため、これは int (4 バイト) には大きすぎます。これは、最も左のビットが符号を表しているためです。そのオーバーフローを修正するには、まず 1 と 0 の文字列を Long として解釈します。long の最大値は 2^63-1 であるため、long で十分です。次に、long を int に変換します。これは、下位 32 ビットを取得するだけで実行できます。


コードのバグは、Long.parseLong を int にキャストしなかったことです。したがって、これは機能するはずです:

lat_bin = Integer.toBinaryString((int)(lat_dec * 1000000));   
lat_dec_conv =  ((int) Long.parseLong(lat_bin, 2)) / 1000000.0;
于 2012-12-23T15:21:34.130 に答える
0
 public static void convertStringToDecimal(String binary) {
    int decimal = 0;

    int power = 0;

    if (binary.charAt(0) == '1' && binary.length() == 32) {

        StringBuilder builder = new StringBuilder();

        for (int i = 0; i < binary.length(); i++) {

            builder.append((binary.charAt(i) == '1' ? '0' : '1'));

        }

        while (binary.length() > 0) {

            int temp = Integer
                    .parseInt(builder.charAt((binary.length()) - 1)+"");
            decimal += temp * Math.pow(2, power++);
            binary = binary.substring(0, binary.length() - 1);

        }

        System.out.println((decimal + 1) * (-1));

    } else {

        while (binary.length() > 0) {
            int temp = Integer
                    .parseInt(binary.charAt((binary.length()) - 1) + "");
            decimal += temp * Math.pow(2, power++);
            binary = binary.substring(0, binary.length() - 1);
        }

        System.out.println(decimal);

    }
}
于 2016-12-18T11:32:41.677 に答える