Java 使用递归将十六进制值转换为十进制值

Java 使用递归将十六进制值转换为十进制值,java,recursion,Java,Recursion,我完全被这件事难住了。我必须利用当前的代码结构,使用递归将用户输入的十六进制值转换为十进制值。无法更改递归调用的方法标头。我已经在没有使用递归的情况下解决了这个问题,但我的一生都无法想象我将如何做到这一点 //编辑--已解决 公共类hextodecimal{ 公共静态void main(字符串[]args){ //使用第719页的值测试解析 系统输出打印LN(十六进制(“7F”); 系统输出打印LN(十六进制(“FFFF”); System.out.println(十六进制(“431”); }

我完全被这件事难住了。我必须利用当前的代码结构,使用递归将用户输入的十六进制值转换为十进制值。无法更改递归调用的方法标头。我已经在没有使用递归的情况下解决了这个问题,但我的一生都无法想象我将如何做到这一点

//编辑--已解决

公共类hextodecimal{
公共静态void main(字符串[]args){
//使用第719页的值测试解析
系统输出打印LN(十六进制(“7F”);
系统输出打印LN(十六进制(“FFFF”);
System.out.println(十六进制(“431”);
}
公共静态int-hexToDecimal(字符串hextString){
返回hexToDecimal(hextstring,0,hextstring.length()-1);
}
公共静态int-hexToDecimal(字符串hextstring、int-end、int-hextlength){
if(六角长度<结束)
返回0;
否则{
整数值;
if(hextstring.charAt(hextlength)='A')
dec值=10;
else if(hextstring.charAt(hextlength)='B')
dec值=11;
else if(hextstring.charAt(hextlength)='C')
decValue=12;
else if(hextstring.charAt(hextlength)='D')
dec值=13;
else if(hextstring.charAt(hextlength)='E')
dec值=14;
else if(hextstring.charAt(hextlength)='F')
dec值=15;
其他的
decValue=hexString.charAt(hexLength)-“0”;
返回hexToDecimal(hextstring,end,hextlength-1)*16
+dec值;
}
}
}

RTFM!下面是以下内容的增强摘录:

将字符串参数解析为第二个参数指定的带符号字符串


RTFM!下面是以下内容的增强摘录:

将字符串参数解析为第二个参数指定的带符号字符串


只有两个选择。处理最左边的字符,然后递归地将子字符串(1)传递给自己,或者处理最右边的字符,然后递归地将左边的字符传递给自己。这就足够了。只有两个选择。处理最左边的字符,然后递归地将子字符串(1)传递给自己,或者处理最右边的字符,然后递归地将左边的字符传递给自己。这应该是一个足够的提示。

假设您必须使用递归,而不能使用
Integer.parseInt()
(您已经知道了这一点,并且可能会破坏提问的目的),那么您可以这样做:

创建递归函数时,需要一个终止条件,以及达到该终止条件的方法。由于您显然必须使用该方法签名,因此在每次递归时传递一个小于1个字符的
字符串之后,终止条件必须是一次
hextstring
为空

如果
hexString
为空,则返回0是有意义的(如果您先阅读下面的内容,可能会更有意义)

您应该每次处理最高有效位,并将解析后的值乘以
16^(hextstring-1的长度)
。16因为十六进制是以16为基数的,并且将其提升到数字位置-1的幂次方,这与在得到数字及其位置(即,十、百、千)后进行10^X十进制运算的原因相同。
字符串的长度给出了这个位置。如果你不明白我的意思,请看下面的例子

现在需要一种解析此字符的方法。一种简单的方法是使用
Map
将每个十六进制
char
映射到其十进制表示形式的
int
,但也可以使用
if
switch
语句。如果
字符
不是有效的十六进制数字,则引发异常

获得此值后,将其添加到
hexToDecimal
的返回值中,即
value+hexToDecimal()
。传递给
hexToDecimal
字符串是修改为
[1,长度]
范围的当前字符串,其中(如上所述)第一个字符被截断

注意:想想为什么不能使用该方法签名从最低有效位(右)开始处理。您如何能够根据十六进制数字的位置将其相乘以获得正确的值

7F
,十进制为127

  • 0x7=7
  • 0xF=15
数字不是7+15,而是7*(16^1)+15

假设您必须使用递归,而不能使用
Integer.parseInt()
(您已经知道,这会使您无法提问),下面是您可以使用的方法:

创建递归函数时,需要一个终止条件,以及达到该终止条件的方法。由于您显然必须使用该方法签名,因此在每次递归时传递一个小于1个字符的
字符串之后,终止条件必须是一次
hextstring
为空

如果
hexString
为空,则返回0是有意义的(如果您先阅读下面的内容,可能会更有意义)

您应该每次处理最高有效位,并将解析后的值乘以
16^(hextstring-1的长度)
。16因为十六进制是以16为基数的,并且将其提升到数字位置-1的幂次方,这与在得到数字及其位置(即,十、百、千)后进行10^X十进制运算的原因相同。
字符串的长度给出了这个位置。如果你不明白我的意思,请看下面的例子

现在需要一种解析此字符的方法。一种简单的方法是使用
Map
将每个十六进制
char
映射到其十进制表示的
int
public class hextodecimal {

    public static void main(String[] args) {

        // Test out the parsing with values from page 719
        System.out.println(hexToDecimal("7F"));
        System.out.println(hexToDecimal("FFFF"));
        System.out.println(hexToDecimal("431"));
    }

    public static int hexToDecimal(String hexString) {
        return hexToDecimal(hexString, 0, hexString.length() - 1);
    }

    public static int hexToDecimal(String hexString, int end, int hexLength) {
        if (hexLength < end)
            return 0;
        else {
            int decValue;
        if (hexString.charAt(hexLength) == 'A')
            decValue = 10;
        else if (hexString.charAt(hexLength) == 'B')
            decValue = 11;
        else if (hexString.charAt(hexLength) == 'C')
            decValue = 12;
        else if (hexString.charAt(hexLength) == 'D')
            decValue = 13;
        else if (hexString.charAt(hexLength) == 'E')
            decValue = 14;
        else if (hexString.charAt(hexLength) == 'F')
            decValue = 15;
        else
            decValue = hexString.charAt(hexLength) - '0';

        return hexToDecimal(hexString, end, hexLength - 1) * 16
            + decValue;
        }
  }
}
F * (16 ^ 3) //Fourth digit
plus
0 * (16 ^ 2) //Third digit
plus
0 * (16 ^ 1) //Second digit
plus
D * (16 ^ 0) //First digit
(15 * (16^3)) + 0 + 0 + 13
61440 + 0 + 0 + 13 = 61453