【问题标题】:Need some explanation about how the hex to decimal algorithm works需要一些关于十六进制到十进制算法如何工作的解释
【发布时间】:2016-05-09 18:13:56
【问题描述】:

下面的算法将十六进制转换为十进制,但我很困惑,这个解决方案是如何工作的?

public static int hex2decimal(String s) {
    String digits = "0123456789ABCDEF";
    s = s.toUpperCase();
    int val = 0;
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        int d = digits.indexOf(c);
        val = 16*val + d;
    }
    return val;
}

source

在我发现这种方法之前,我只知道一种方法可以做到这一点。 我的意思是,每个人都知道: X*16^Y 其中 X 是您要转换的数字, Y 是数字的位置(从末尾求开始)。

所以,如果你想将 DA145 转换为十进制将是......

*(5 * 16^0) + (4 * 16^1) + (1 * 16^2) + (10 * 16^3) + (13 * 16^4)*

【问题讨论】:

  • 使用|&lt;&lt; 4 而不是+* 16 实际上更快(通常可以忽略不计,除非您重复运行此代码),因为您基本上只是在编辑小点.另外,我认为java.lang.Integer 类中有一个方法可以做到这一点?
  • @Pemap modder 谢谢,我确定它存在

标签: java algorithm hex decimal


【解决方案1】:

该算法使用了这样一个事实,即我们可以通过重复将 16 相乘来计算 16^Y,并且我们可以将常见的乘法乘以 16 分解出来。从您的示例中,您将改为结束:

13*16 + 10)*16 + 1)*16 + 4)*16 + 5

我省略了前括号,正如你所见,实际上 13 实际上是乘以 16 四倍。

【讨论】:

    【解决方案2】:

    该算法的作用与您所做的几乎相同。它接受一个字符串并将每个字符与给定值进行比较。该值由数字评估,它所处的位置(例如,A 位于第 10 位,因为我们从 0 开始计数)。这允许轻松更改它,例如到 17 位系统而不是十六进制。

    编辑:关于 16 的幂,请查看 @skykings 的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 2018-07-26
      • 2014-08-24
      • 2016-01-05
      相关资源
      最近更新 更多