Integer.parseInt 大号和保留号?

Integer.parseInt large number and retain sign?

我正在处理十六进制值,我需要保留值的符号。我想知道是否有人有创造性的方法来保留 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

我是不是理解错了?似乎失败是由于设置了符号位。

如果你想一次存储 32 位,在我看来明显的解决方案是用 Long.parseLong 来解析:

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

(不过你确定要将这些值保持为 float 吗?那样你会丢失信息...)

如果Java 8 is available you can use the new unsigned operations in it (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位。