我有一个 3 字节的有符号数,我需要用它来确定 Java 中的值。我相信它是用一个人的补充签名的,但我不是 100% 确定(我已经有 10 多年没有研究过这些东西了,我的问题的文档也不是很清楚)。我认为我遇到的问题是 Java 在二进制补码中完成所有事情。我有一个具体的例子来展示:
原始的 3 字节数字:
0xEE1B17
解析为整数 (
Integer.parseInt(s, 16)
) 这将变为:15604503如果我对此进行简单的位翻转(
~
),我会得到(我认为)一个二进制补码表示:-15604504但我应该得到的价值是:-1172713
我认为正在发生的是我得到了整个 int 的二进制补码,而不仅仅是 int 的 3 个字节,但我不知道如何解决这个问题。
我能够做的是将整数转换为二进制字符串 ( Integer.toBinaryString()
),然后手动将所有 0“翻转”为 1,反之亦然。然后解析这个整数 ( Integer.parseInt(s, 16)
) 时,我得到非常接近的 1172712。在所有其他示例中,我需要始终在结果中加 1 才能得到答案。
任何人都可以诊断这里使用的是什么类型的有符号数字编码,以及是否有除了手动翻转字符串的每个字符之外的解决方案?我觉得必须有一种更优雅的方式来做到这一点。
编辑:所有响应者都以不同的方式提供帮助,但我的一般问题是如何翻转 3 字节数字,@louis-wasserman 回答了这个问题并首先回答了,所以我将他标记为解决方案。感谢大家的帮助!