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

时间:2011-12-05 05:30:32

标签: java recursion

我完全被这个问题困住了。我必须利用当前的代码结构,使用递归将用户输入的十六进制值转换为十进制值。无法更改递归调用的方法标头。我没有使用递归计算出来,但是对于我的生活来说,我无法理解我将如何做到这一点。

//编辑 - 已解决

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;
        }
  }
}

5 个答案:

答案 0 :(得分:2)

只有两个选择。处理最左边的char,并递归地将substring(1)传递给自己,或处理最右边的char,并递归地向左传递什么。这应该是一个暗示。

答案 1 :(得分:2)

假设您必须使用递归,并且您无法使用Integer.parseInt()(您已经知道并且会破坏询问的目的)问题),你可以这样做:

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

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

您应该每次处理最重要的数字,并将解析后的值乘以hexString。 16因为十六进制是基数16,并且将其提升到数字位置的幂 - 1,出于同样的原因,一旦你有数字和它的位置(即数十,数百,数千),你将以十进制为10 ^ X. 16 ^ (length_of hexString - 1)的长度为我们提供了这个位置。 如果您不明白我的意思,请查看底部的示例。

现在你需要一种解析这个角色的方法。一种简单的方法是使用String将每个十六进制Map映射到其十进制表示的char,但您也可以使用intif语句。如果switch不是有效的十六进制数字,则抛出异常。

获得此值后,将其添加到char的返回值,即。 hexToDecimal。传递给value + hexToDecimal()的{​​{1}}是修改为范围String的当前字符串,其中(如上所述)第一个字符被删除。

注意:想一想为什么不能使用该方法签名从最低位数(右)处理。你怎么能根据它的位置乘以十六进制数字来给它正确的值?

即。 hexToDecimal,十进制为127。

  • 0x7 = 7
  • 0xF = 15

数字 7 + 15,但是7 *(16 ^ 1)+ 15!

答案 2 :(得分:1)

RTFM!这是javadoc for Integer.parseInt(String, int)的增强摘录:

  

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

答案 3 :(得分:1)

我认为这里的关键是要意识到每个数字的重要性。例如,十六进制中的F00D是:

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

所以在每一步中,你都会在序列中将它提升到16位。

您可以使用字符串的长度来确定您所在的位置,并将剩余的数字传递给下一次迭代。每个函数将以递归方式添加到结果中。

例如:

  1. 第一次迭代将F00D并返回61440 + hexToDecimal("00D")
  2. 第二次迭代将00D并返回0 + hexToDecimal("0D")
  3. 第三次迭代将0D并返回0 + hexToDecimal("D")
  4. 第四次迭代将采用D并返回13,而不再调用自身,因为字符串的长度为1。
  5. 现在只是编写代码! :)

答案 4 :(得分:0)

如果它是1位十六进制数(0-F),那么它很容易解析。你可以用开关来做。

如果它是n> 1位十六进制数,则它太难了。将其分为两个数字 - 一个n-1位数字和一位数字。