1 回答
TA贡献1836条经验 获得超5个赞
好的,让我们一行一行
public static int getDecimal(String hex)
hex 是参数,它需要在那里声明,所以你可以在调用函数时传递一个字符串。
String digits = "0123456789ABCDEF";
是的,这声明了一个字符串,其中包含可以出现在十六进制数中的所有字符。
hex = hex.toUpperCase();
它将十六进制字符串中的字母转换为大写,以使其保持一致,即无论输入哪个,您总是有 F 而从来没有 f。
int val = 0;
这是稍后将包含相应十进制值的变量。我们将使用此变量进行计算。
for (int i = 0; i < hex.length(); i++)
hex.length()
是提供的十六进制字符串中的字符数。我们对每个字符执行一次 for 循环中的代码。
char c = hex.charAt(i);
是的,char 代表单个字符。我们从索引 i 处的十六进制字符串中检索字符,因此在第一次迭代中它是第一个字符,在第二次迭代中是第二个字符,依此类推。
int d = digits.indexOf(c);
我们查看字符在 digit-String 中的索引。通过这种方式,我们确定了这个特定数字的十进制表示。就像 0-9 保持 0-9 而 F 变成 15。
val = 16*val + d;
让我们想想我们必须做什么。我们有数字的十进制值。但是在十六进制中,我们将这个数字放在一个特定的位置,它会与它相乘。就像'100'中的'1'实际上不是1,而是100 * 1,因为它在这个位置。十六进制的10是十进制的16,因为我们有1 * 16。现在这里的方法有点复杂。val 不是未初始化的。val 开始时为 0,然后包含来自先前迭代的累积值。由于 String 中的第一个字符是最高位置我们不直接知道我们必须乘以什么,因为我们不知道数字有多少位(实际上我们知道,但这种方法没有使用这个) . 所以我们只需将数字值添加到它。在连续迭代中,它将乘以 16 以将其放大到相应的数字基值。让我给你看一个例子:
取25F作为十六进制数。现在第一次迭代取 2 并将其转换为 2 并将其添加到 val。在16 * val
0做出决议,从而不能有效地在第一时间。
下一次迭代将 2 与 16 相乘,并取 5(转换为 5)并将其添加到 val。所以现在我们有了(我用数学方法把它分开,所以你理解它): 2 * 16 + 5
接下来我们得到十进制 15 的 F。我们将 val 乘以 16 并加上 15。
我们得到2 * 256 + 5 * 16 + 16 (* 1)
,这实际上是您如何以数学方式计算此十六进制值的十进制值。
计算 val 的另一种可能性是:
val += Math.pow(16, hex.length() - i - 1) * d;
添加回答
举报