【问题标题】:Hex to Decimal Conversion Issue十六进制到十进制转换问题
【发布时间】:2013-09-13 00:43:22
【问题描述】:

第一篇文章在这里。我有一个从十六进制转换为十进制的任务,包括其他转换,但这个让我很难过......

所以我需要转换的十六进制值是 12345678、2A3DF8A7、00FF00FF。 00FF00FF 工作正常,这是给我带来麻烦的数值。

我知道你应该将数字乘以 16^n,但由于某种原因,我得到的值太高了,即使我认为我做得对。显然不是,因为它不起作用。帮助将不胜感激!

我的代码在过去的一个小时里一直在改变,但问题是最后一个“else”。

public void toDec()
{
    dec = 0;
    for (int j = 0, i = 7; j < hex.length(); j++){

        if (hex.charAt(j) == 'A') {
            dec += (10 * (int)Math.pow(16, i));
        }
        else if (hex.charAt(j) == 'B') {
            dec += (11 * (int)Math.pow(16, i));
        }
        else if (hex.charAt(j) == 'C') {
            dec += (12 * (int)Math.pow(16, i));
        }
        else if (hex.charAt(j) == 'D') {
            dec += (13 * (int)Math.pow(16, i));
        }
        else if (hex.charAt(j) == 'E') {
            dec += (14 * (int)Math.pow(16, i));
        }
        else if (hex.charAt(j) == 'F') {
            dec += (15 * (int)Math.pow(16, i));
        }
        else if (hex.charAt(j) == '0') {
            dec = dec;
        }
        else {
            dec += ((int)hex.charAt(j)) * ((int)Math.pow(16, i));
        }
        i--;
    }
}

【问题讨论】:

  • 只是一个评论。您可以通过将 i 变量替换为 hex.length() - 1 - j 来摆脱它。使其也适用于长于或短于 8 位的十六进制值...
  • 如果只是 8 位数字,Math.pow(16, i) 可以简单地为 1 &lt;&lt; i * 4,因为 16 是 2 的幂,位移就可以了。

标签: java hex decimal


【解决方案1】:

将 char 转换为 int 是这里的问题 - 你得到的是 char 代码,而不是表示特定数字的 int 值。 试试看:System.out.println((int) '5');

解决这个问题的最简单方法是(hex.charAt(j) - '0')

【讨论】:

    【解决方案2】:

    您的问题出在您的 else 子句中,处理数字 1 到 9。

    问题在于您将数字与代表它们的字符混淆了。例如,数字 1 由字符 '1' 表示,其字符代码为 49。因此,当您在 else 子句(即 (int)hex.charAt(j))中将 '1' 字符转换为 int 时,您回过头来,它的字符代码是 49,而不是 1。

    现在,解决此问题的简单(和惯用)方法是对您的角色使用整数数学。例如,使用hex.charAt(j) - '0' 而不是(int)hex.charAt(j)。这是因为字符 '0''9' 被分配了连续的字符代码 48 到 57,因此(例如)从 '1' 的字符代码中减去 '0' 的字符代码(即 48)(即49) 返回实际的数字值,因为49 - 48 = 1。其他数字也一样:'5' - '0' 等价于 53 - 48,(当然)等于 5。

    更好的是,同样的方法也适用于您的其他十六进制字符!例如,如果您执行'C' - 'A' + 10,您将得到结果12(这是字母C 的十六进制值)。

    【讨论】:

    • 非常感谢我忘记了这个问题!我已经有几个月没有练习了,像这样的小细节肯定让我忘记了……再次感谢你!由于代表人数少,我无法投票。
    • @user2774695:不用担心。很高兴能够提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 2015-05-22
    • 2011-11-27
    • 2018-07-26
    相关资源
    最近更新 更多