JAVA:输入是字符串表示中的十六进制数字,例如“0xaf12”。任务是将此数字的值添加到数组 (int) 中

JAVA: The input is hexadecimal numbers in string representation, for example "0xaf12". The task is to add the value of this number to the array (int)

提问人:Timofey 提问时间:10/1/2023 更新时间:10/2/2023 访问量:71

问:

问题是我无法将这个十六进制数的 int 值以十六进制形式放在那里。 但是,如果我将其转换为十进制值,那么从“0x8000_0000”开始的所有值都不会解析为 int,因为这些值超出了 int。如果我解析 Long,则会得到无符号的巨大数字,我不需要这样的数字 - 我需要 int 范围内的有符号数字。

我试着这样做,我认为这是正确的,因为我检查的一些例子都是正确的,但对作业的测试表明它是不正确的。但是错误出来的数字没有显示给我。

长 b = Long.parseLong(“ffffffff”, 16); System.out.println((int) (Integer.MIN_VALUE + (b - 整数.MAX_VALUE - 1)));

我还在互联网上看到,你可以以某种方式尝试通过位移,但我没有发现这些信息对我的任务有任何用处。

Java 解析 整数 十六进制

评论

0赞 g00se 10/1/2023
十六进制例程在 Java 中确实有些失效。首先,他们感到困惑,为什么他们真的在乎0x8000_0000是否>?这是一个有点模式,适合 .你可以尝试:你的十六进制字符串在哪里,你的十六进制字符串在哪里,这是有道理的,因为它是非标准的,并且是程序员的视觉辅助工具0xInteger.MAX_VALUEinta[0] = Long.decode(s.replaceAll("_", "")).intValue();saint[]_

答:

0赞 Elliott Frisch 10/1/2023 #1

那么所有从“0x8000_0000”开始的值都不会解析为 int

因为是.显然,超过最大可能不能存储在 .如果需要支持任意值,请使用 BigInteger0x8000_0000Integer.MAX_VALUE + 11intint

String s = "0x8000_0000";
BigInteger bi = new BigInteger(s.substring(2).replaceAll("_", ""), 16);
System.out.println(bi.subtract(BigInteger.valueOf(Integer.MAX_VALUE)));

输出

1
0赞 WJS 10/1/2023 #2

如果我解析 Long,则会得到无符号的巨大数字,我不需要这样的数字 - 我需要 int 范围内的有符号数字。

正如@g00se在评论中所说,您可以使用 Long.decode 来实现这一点。然后获取 .但首先,您必须删除下划线,因为解码会引发异常,不允许使用下划线。intValue

String[] hexValues = {"0x8000_0000", "0x8000_0001", 
        "0x1ab3", "0x10", "0x9", "0xFFFF_FFFF"};
List<Integer> ints = new ArrayList<>();

for (String hex : hexValues) {
    ints.add(Long.decode(hex.replace("_","")).intValue());
}

for (int v : ints) {
    System.out.println(v);
}

指纹

-2147483648
-2147483647
6835
16
9
-1

您也可以通过使用循环将 String 值命令式转换为十进制来做到这一点。这是它的工作原理。考虑并从 .0x2AF2

v = 0   // initialize v
v = v * 16 + 2  (0*16) + 2 = 0 + 2
v = v * 16 + 10 (2* 16) + 10 =32 + 10 = 42
v = v * 16 + 15 (42*16) + 15 = 672 + 15 = 687
  • 首先声明一串十六进制数字
  • 每个索引都是它们的十进制等效项
  • 转换为大写,重复前面演示的过程。
String hexDigits = "0123456789ABCDEF";
for (String hex : hexValues) {
     int value = 0;
     for (char c : hex.toUpperCase().toCharArray()) {
         int index = hexDigits.indexOf(c);
         if (index >= 0) {
             value = value * 16 + index; 
         }
     }
     ints.add(value);
}

0赞 Reilas 10/2/2023 #3

"...如果我解析 Long,则获得无符号的巨大数字,我不需要这样的数字 - 我需要 int 范围内的有符号数字。..."

使用 Long 进行解析,并在添加之前检查范围。

long b = Long.parseLong("ffffffff", 16);
if (b >= Integer.MIN_VALUE && b <= Integer.MAX_VALUE) {

}