Java将负二进制转换回整数

krz*_*iek 1 java binary decimal negative-number

我正在尝试将基数 10 的数字转换为基数 2 并返回基数 10。它仅适用于正参数_十进制

argument_binary = Integer.toBinaryString(argument_decimal);
back_converted_argument_decimal = Integer.valueOf(argument_binary, 2);
Run Code Online (Sandbox Code Playgroud)

对于argument_decimal 为负,我得到“java.lang.NumberFormatException:对于输入字符串:“111111111111111111111111111111111”

编辑:这是我所做的:

latitude_binary = Integer.toBinaryString((int)(latitude_decimal * 1000000));   
back_converted_latitude_decimal =  Long.parseLong(latitude_binary, 2) / 1000000.0;
Run Code Online (Sandbox Code Playgroud)

这给了我不好的结果,比如 -1.1 来回转换为 4293.867296

Mar*_*aux 5

尝试通过一个长:

String binary = Integer.toBinaryString(-1);
long l = Long.parseLong(binary, 2);
int i = (int) l;
Run Code Online (Sandbox Code Playgroud)

经过测试,正在运行。

为什么这样做是因为 -1 在系统内存中表示为 32 位 1 的序列。使用 toBinaryString 方法时,它使用该精确表示创建一个字符串。但是,1 的 32 位实际上等于 2^32 - 1。这对于 int(4 个字节)来说太大了,因为 int 来自 [-2^31, 2^31-1]。这是因为最左边的位代表符号。因此,要修复该溢出,首先将 1 和 0 字符序列解释为 Long。long 可以,因为 long 的最大值是 2^63-1。然后将 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;
Run Code Online (Sandbox Code Playgroud)