Эффективный способ преобразовать шестнадцатеричное представление числа в десятичное значение - PullRequest
2 голосов
/ 21 ноября 2011

У меня есть массив байтов [5], который представляет десятичное число при печати в виде шестнадцатеричной строки. Две цифры могут храниться в одном байте, шестнадцатеричные символы не используются. Э.Г.

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

Есть ли в Java более эффективный способ (возможно, немного магии битового сдвига) для преобразования в десятичное число, отличное от

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

Эффективное преобразование наоборот также было бы интересно ...

Ответы [ 3 ]

3 голосов
/ 21 ноября 2011
((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))
2 голосов
/ 21 ноября 2011

Ну вот, уловка в том, чтобы покусывать 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
1 голос
/ 21 ноября 2011

После Кнута, Искусство компьютерного программирования, Том II Получисленные алгоритмы, ответ на упражнение 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...