Performance question: Fastest way to convert hexadecimal char to its number value in Java?
A preinitialised array would be faster than a HashMap. Something like this:
int CharValues['f'-'0'+1] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, ... -1, 10, 11, 12, ...};
if (c < '0' || c > 'f') {
throw new IllegalArgumentException();
}
int n = CharValues[c-'0'];
if (n < 0) {
throw new IllegalArgumentException();
}
// n contains the digit value
You should benchmark this method against other methods (such as Jon Skeet's direct method) to determine which will be the fastest for your application.
A hash table would be relatively slow. This is pretty quick:
if (c >= '0' && c <= '9')
{
return c - '0';
}
if (c >= 'a' && c <= 'f')
{
return c - 'a' + 10;
}
if (c >= 'A' && c <= 'F')
{
return c - 'A' + 10;
}
throw new IllegalArgumentException();
Another option would be to try a switch/case statement. An array might be okay if it's in cache, but a miss could be expensive.
I don't recall seeing this method before, but Mikko Rantanen pointed this equation out in a comment on the question, Code golf - hex to (raw) binary conversion
(char | 32) % 39 - 9
I don't know what it would benchmark as (perhaps someone can add it to the benchmark above and run it, but I'm guessing the % kills the performance) - but it's a neat, simple one-liner for single character hexadecimal to decimal conversion. Handles 0-9, A-F, a-f.