【问题标题】:How do I convert a hex string to a signed int value in Java?如何在 Java 中将十六进制字符串转换为带符号的 int 值?
【发布时间】:2018-03-26 00:06:14
【问题描述】:

在我的计算机组织课上,我们被分配了一个程序。我被困在一件事上。我将值 7FF 作为字符串,我需要将其转换为带符号的 int。我可以把它变成一个无符号整数。我得到的值是 2047。正确的值应该是 -1。

现在这是我所拥有的:

int x = Integer.parseInt("7FF", 16);

我试过用一个短的来投射它,但没有做任何事情。任何帮助,将不胜感激!谢谢。

编辑:所以我的主要问题是,如何使用十六进制字符串“7FF”生成 -1 的输出?

【问题讨论】:

  • Java 没有无符号整数。为什么它会返回-1?你问的不是很清楚。
  • @shmosel 我明白这一点。我们必须从文件中读取十六进制值。我们必须在程序中使用这些值,并且它们需要是有符号的值。因此,虽然我知道 java 没有该功能,但我正在尝试找到一种使其工作的方法。我需要它能够从该数字产生 -1。
  • Java 确实有带符号的值。而且您还没有解释为什么它会评估为 -1。
  • @KeenanKaufman 仅在 11 位机器上。
  • @KeenanKaufman 您说您尝试转换为short,但short 是16 位,而7FF 作为short0000 0111 1111 1111。因为第一位是0,所以它是一个正数。 7FF 成为 -1 的唯一方法是使用 11 位值(正如其他人提到的),您在任何地方都没有说明。如果您真的想将十六进制解析为 11 位有符号值,请编辑问题并澄清这一点,以便我们知道您想要使用模糊的 11 位值,而不仅仅是对符号位的位置感到困惑位于。

标签: java casting hex decimal signed


【解决方案1】:

要将十六进制字符串解析为 11 位有符号值,可以使用以下方法。

该算法取自 Sean Eron Anderson 的 Bit Twiddling Hacks

public static int parseElevenBits(String hex) {
    return Integer.parseInt(hex, 16) << 21 >> 21;
}

测试

System.out.println(parseElevenBits("400"));
System.out.println(parseElevenBits("401"));
System.out.println(parseElevenBits("7FE"));
System.out.println(parseElevenBits("7FF"));
System.out.println(parseElevenBits("0"));
System.out.println(parseElevenBits("1"));
System.out.println(parseElevenBits("3FE"));
System.out.println(parseElevenBits("3FF"));

输出

-1024
-1023
-2
-1
0
1
1022
1023

【讨论】:

  • @shmosel 实际上我是故意漏掉的,所以人们会查看链接并从中学习。
猜你喜欢
  • 2013-02-18
  • 2015-10-10
  • 2019-07-23
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 2013-02-07
相关资源
最近更新 更多