如何将双重签名值转换为十六进制签名值

时间:2015-04-10 12:26:52

标签: java hex

寻找解决我的问题的解决方案,我发现只有Hex符号转换为int值,但不是相反的情况。

我试过这个:

  float grades = -32.33f ;
  System.out.println("grades: "+grades);

  double radians = Math.toRadians(grades);
  System.out.println("rad: "+radians);

  radians = radians * 100000000;
  System.out.println("rad * 10^8: "+radians);

  String hex = Double.toHexString(radians);
  System.out.println("signed to hex: "+hex);

带输出:

grados: -32.33
rad: -0.5642649791276998
rad * 10^8: -5.642649791276998E7
signed to hex: -0x1.ae8000f4d5a59p25

但我期待得到:

FCA30001

在这个回答Java negative int to hex and back fails中,我发现Double.toHexString(radians);给了我一个未定值的值,可能这就是问题所在。任何想法?

提前致谢。

编辑:

我正在尝试执行以下的逆操作:

  • 1)FCA30001到signed int是:-56426495,
  • 2)-56426495 * 10 ^ 8是-0.564264弧度,
  • 3)现在将弧度转换为等级为-32.33。

1 个答案:

答案 0 :(得分:0)

检查long / int溢出:10 8 需要23位+2π3位< 32,所以int很好。

long radiansUp8 = 0xFFFF_FFFFL & (long)(radians * 100_000_000);
String hex = Long.toHexString(radiansUp8);

虽然我们拿了一个int,因为符号,它被放在一个long中,并用Integer.MAX_VALUE掩盖。


精确度:

如您所知double只是2的幂和的近似值。乘以10 8 会放大近似误差。在您的代码中,甚至使用了4个字节float

double grades = -32.33;

应该会好一点。