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);
}
现在两者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);
添加回答
举报