【问题标题】:Efficient way to convert a hex representation of a number to a decimal value将数字的十六进制表示转换为十进制值的有效方法
【发布时间】:2012-01-02 13:23:52
【问题描述】:

我有一个 byte[5] 数组,当打印为十六进制字符串时,它代表一个十进制数。两个数字可以存储在一个字节中,不使用十六进制字符。 例如

[0x11,0x45,0x34,0x31,0x21] -> 1145343121.

在 Java 中是否有更有效的方法(可能是一些移位魔法)来转换为十进制数而不是

long result = Long.parseLong(byteToHexString(bytes[]));?

反之亦然的有效转换也会很有趣...

【问题讨论】:

  • 你牺牲了很多 CPU 周期,却只获得很少的内存。
  • 其实我也不是这么选择的... ;)

标签: java hex decimal


【解决方案1】:

在 Knuth,计算机编程艺术,第二卷 半数值算法,回答练习 4.4(19):

public long binaryValue(long bcd)
{
    long    x = bcd;
    x -= ((x & 0xf0f0f0f0f0f0f0f0L) >> 4)*(0x10-10);
    x -= ((x & 0xff00ff00ff00ff00L) >> 8)*(0x100-100);
    x -= ((x & 0xffff0000ffff0000L) >> 16)*(0x10000-10000);
    x -= ((x & 0xffffffff00000000L) >> 32)*(0x100000000L-100000000);
    return x;
}

【讨论】:

    【解决方案2】:

    给你,诀窍是一次啃一个nibble

        byte[] buf = { 0x11, 0x45, 0x34, 0x31, 0x21 };
        long result = 0;
        for (int i = 0; i < buf.length; i++) {
            result = result * 100 + (buf[i] >> 4 & 0XF) * 10 + (buf[i] & 0XF);
        }
        System.out.println(result);
    

    输出

    1145343121
    

    【讨论】:

    • 是的,谢谢,效果很好,看起来又短又甜。做了一个小测试:优于普通方法 6 倍。
    【解决方案3】:
    ((a[0]>>>4)*1000000000L + (a[0]&15)*100000000L +
     (a[1]>>>4)*  10000000L + (a[1]&15)*  1000000L +
     (a[2]>>>4)*    100000L + (a[2]&15)*    10000L +
     (a[3]>>>4)*      1000L + (a[3]&15)*      100L +
     (a[4]>>>4)*        10L + (a[4]&15))
    

    【讨论】:

    • 抱歉,无法正常运行。将结果分配给一个长变量。错了吗?
    猜你喜欢
    • 2018-02-17
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 2018-01-22
    • 1970-01-01
    • 2014-12-05
    相关资源
    最近更新 更多