3 回答

TA貢獻1772條經驗 獲得超5個贊
"11000111001100101010010011101110"
是一個以 1 開頭的 32 位二進制數。這意味著它可以表示int
2 的補碼中的負數。
但是,Integer.parseInt
不希望它的輸入是 2 的補碼表示。它期望符號用前導表示-
,而不是用符號位表示,正如您可以在 Javadoc 中閱讀的那樣:
int java.lang.Integer.parseInt(String s, int radix) 拋出 NumberFormatException
將字符串參數解析為第二個參數指定的基數中的有符號整數。字符串中的字符必須都是指定基數的數字(由java.lang.Character.digit(char, int)是否返回非負值決定),除了第一個字符可以是ASCII減號'-' ('\u005Cu002D') 表示負值或 ASCII 加號 '+' ('\u005Cu002B') 表示正值。返回結果整數值。
因此,它被視為"11000111001100101010010011101110"
超出int
類型范圍的 32 位正數。
以下可用于重新計算 的值intFloat
:
// replace the leading 1 with - if it's a sign bit
str = (str.length () == 32 && str.charAt (0) == '1') ? ('-' + str.substring (1)) : str;
int revint = Integer.parseInt(str, 2);
// for negative number, we must compute the 2's complement of the number returned
// by parseInt
if (revint < 0) {
revint = -1 * (revint + Integer.MAX_VALUE + 1);
}
現(xiàn)在兩者intFloat和revint將等于-952982290。
編輯:
Java 確實有您需要的 API,只是您沒有使用正確的方法。由于toBinaryString(int i)返回“整數參數的字符串表示作為基數為 2的無符號整數”,您應該使用Integer.parseUnsignedInt(String, int)以恢復傳遞給的值toBinaryString:
float flt = -45732.9287f;
int intFloat = Float.floatToRawIntBits(flt);
String str = Integer.toBinaryString(intFloat);
System.out.println("------- Now do the Reverse -------");
System.out.println (str);
int revint = Integer.parseUnsignedInt(str, 2);
添加回答
舉報