将数字的十六进制表示转换为十进制值的有效方法

时间:2011-11-20 22:09:50

标签: java hex decimal

我有一个byte [5]数组,表示以十六进制字符串形式打印时的十进制数。两个数字可以存储在一个字节中,不使用十六进制字符。 E.g。

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

在Java中是否有更有效的方法(可能有些位移技术)转换为除

之外的十进制数字
long result = Long.parseLong(byteToHexString(bytes[]));?

有效的转换反之亦然......

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分: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

答案 2 :(得分: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;
}