【发布时间】:2011-04-25 12:27:38
【问题描述】:
假设我从输入设备读取了这些字节:“6F D4 06 40”。该数字是 MilliArcSeconds 格式的经度读数。最高位(0x80000000)基本上总是零,并且在这个问题中被忽略。
我可以轻松地将字节转换为 无符号 整数:1876166208
但是如何将无符号值转换为其最终形式的 31 位有符号整数?
到目前为止,我想出的只是:
- 如果 value & 0x40000000 那么它实际上是负数,需要转换它
- 如果是负数,则去掉最高位并处理剩余位...
所以我可以判断它是否是一个负数,但为了知道负数是什么值,我必须对剩余的位做一些事情 - 一个人的恭维?我如何在 Java 中做到这一点?
另一种提问方式是,如何在 Java 中将无符号整数转换为 31 位有符号整数?
谢谢!
【问题讨论】:
-
我想我在回答中误解了你的问题。根据您的示例输入,您能说出您希望有符号整数的值是多少吗?你从来没有说过。
-
输入:“6F D3 FD 45”。输出:大约 -75.366465。我说近似值是因为我找到了一个地点并留在那里收集数据,同时用 GPS 测量了位置。因此,上面的经度 (-75.366465) 应该接近,但可能不完全相同,与上述十六进制字节转换为有符号整数(并执行 MAS 到度数转换)的值相同。 我正在尝试找到一种使用 Java 将十六进制字节转换为有符号整数的方法
-
MAS 度数:除以 3,600,000。
-
接近... 去除“负位”的实际读数:“2F D3 FD 45”...将此与“10 2C 00 EA”的预期 MAS 值 -75.366465 进行比较。 . 如果我将 1 翻转为 0 并将 0 翻转为 1 (XOR),则前 22 位匹配。我认为这可能是诀窍 - 需要翻转所有位......我可以用 XOR 来做到这一点......
-
@Mark - 你是对的。我很抱歉。
标签: java type-conversion signed