我想一个十进制数转换为基体2回基地10.仅适用于正argument_decimal
argument_binary = Integer.toBinaryString(argument_decimal);
back_converted_argument_decimal = Integer.valueOf(argument_binary, 2);
对于argument_decimal beeing负,我得到“java.lang.NumberFormatException:对于输入字符串:‘11111111111111111111111111111111’”
编辑:这是我做的:
latitude_binary = Integer.toBinaryString((int)(latitude_decimal * 1000000));
back_converted_latitude_decimal = Long.parseLong(latitude_binary, 2) / 1000000.0;
这给了我喜欢-1.1坏的结果是来回转换为4293.867296
尝试通过长走:
String binary = Integer.toBinaryString(-1);
long l = Long.parseLong(binary, 2);
int i = (int) l;
经测试,和工作。
为什么这个工作原理是,因为-1被表示为在系统存储器32个中位1的序列。 当使用toBinaryString方法,它创建使用该确切表示的字符串。 但是,一个32个比特实际上等于2 ^ 32 - 1。即对于一个int(4个字节)过大时,因为一个int从[-2 ^ 31,2 ^ 31-1]熄灭。 这是因为最左边位表示符号。 因此,要解决这个溢出,首先解释1个0字符作为一个长期的该序列。 长这样做,因为很长一段的最大值为2 ^ 63-1。 然后就是漫长的转换为int。 这是通过简单地把低32位来完成。
在你的代码的错误是,你没有投中的Long.parseLong为int。 所以这应该工作:
lat_bin = Integer.toBinaryString((int)(lat_dec * 1000000));
lat_dec_conv = ((int) Long.parseLong(lat_bin, 2)) / 1000000.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);
}
}