Integer.parseInt大数并保留符号?

时间:2015-03-20 08:09:04

标签: java parseint

我正在使用十六进制值,我需要保留值的符号。我想知道是否有人有创造性的方法来保留int的符号而不使用BigInteger?我无法使用BigInteger因为尺寸限制而不在我的图书馆中;我的程序在嵌入式环境中运行。

我有一串十六进制值如下: 55844d000000000080027d801cf6380006f416c0c23d3e4000000000

    String          ssumI = null;
    String          ssumQ = null;
    String          sazI   = null;
    float           isumI = 0;
    float           isumQ = 0;
    float           iazI  = 0;

    ssumI = data.substring(0,8); 
    isumI = (float)(Integer.parseInt(ssumI, 16)/Math.pow(2,bits));
    //55844d00 parses fine

    ssumQ = data.substring(8,16); 
    isumQ = (float)(Integer.parseInt(ssumQ, 16)/Math.pow(2,bits));
    //00000000 parses fine

    sazI = data.substring(16, 24); 
    iazI = (float)(Integer.parseInt(sazI, 16)/Math.pow(2,bits));
    //80027d80 fails - NumberFormatException
    //should be -1,036,173,760 and in the int range

我不能正确理解失败吗?似乎失败是由于符号位被设置。

2 个答案:

答案 0 :(得分:3)

如果你想一次存储32位,我认为显而易见的解决方案是用Long.parseLong解析:

isumI = (float)(Long.parseLong(ssumI, 16) / Math.pow(2, bits));

(你肯定希望将这些值保持为float吗?你正在以这种方式丢失信息......)

答案 1 :(得分:0)

如果Java 8可用,您可以在其中使用新的无符号操作(How to use the unsigned integer in java 8?)。

isumI = (float)(Integer.parseUnsignedInt(ssumI, 16)/Math.pow(2,bits));

但由于每个字符串都有32位,我认为bits小于32.在这种情况下,您可以将其重写为

isumI = Integer.parseUnsignedInt(ssumI, 16)/(float)(1 << bits);

如果bits可以大于32(但小于64),请将1替换为1L

另外,请注意函数中的位未更改,您应将Math.pow(2, bits)替换为1 << bits并将其存储在单独的变量中,而不是一次又一次地重新计算。

无论如何,如果您打算将字符串用作大值,那么您应该将其存储在int数组中。 float只有24位有效数字,如果值很大,你可能会失去低8位。