【发布时间】:2013-02-04 19:53:18
【问题描述】:
我有一个 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 回答了这个问题并首先回答了,所以我将他标记为解决方案。感谢大家的帮助!
【问题讨论】:
标签: java byte bit sign complement