提问人:Timofey 提问时间:10/1/2023 更新时间:10/2/2023 访问量:71
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)
问:
问题是我无法将这个十六进制数的 int 值以十六进制形式放在那里。 但是,如果我将其转换为十进制值,那么从“0x8000_0000”开始的所有值都不会解析为 int,因为这些值超出了 int。如果我解析 Long,则会得到无符号的巨大数字,我不需要这样的数字 - 我需要 int 范围内的有符号数字。
我试着这样做,我认为这是正确的,因为我检查的一些例子都是正确的,但对作业的测试表明它是不正确的。但是错误出来的数字没有显示给我。
长 b = Long.parseLong(“ffffffff”, 16); System.out.println((int) (Integer.MIN_VALUE + (b - 整数.MAX_VALUE - 1)));
我还在互联网上看到,你可以以某种方式尝试通过位移,但我没有发现这些信息对我的任务有任何用处。
答:
那么所有从“0x8000_0000”开始的值都不会解析为 int
因为是.显然,超过最大可能不能存储在 .如果需要支持任意值,请使用 BigInteger
。0x8000_0000
Integer.MAX_VALUE + 1
1
int
int
String s = "0x8000_0000";
BigInteger bi = new BigInteger(s.substring(2).replaceAll("_", ""), 16);
System.out.println(bi.subtract(BigInteger.valueOf(Integer.MAX_VALUE)));
输出
1
如果我解析 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 值命令式转换为十进制来做到这一点。这是它的工作原理。考虑并从 .0x2AF
2
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);
}
"...如果我解析 Long,则获得无符号的巨大数字,我不需要这样的数字 - 我需要 int 范围内的有符号数字。..."
使用 Long 进行解析,并在添加之前检查范围。
long b = Long.parseLong("ffffffff", 16);
if (b >= Integer.MIN_VALUE && b <= Integer.MAX_VALUE) {
}
评论
0x
Integer.MAX_VALUE
int
a[0] = Long.decode(s.replaceAll("_", "")).intValue();
s
a
int[]
_