解码十六进制数字的最快方法

时间:2015-11-25 20:11:35

标签: algorithm hex

我正在寻找获得十六进制ASCII字符的十进制值的最快方法,即保证出现在以下字符串中的一个(它可以是小写或大写,但没有空格):

0123456789ABCDEFabcdef

到目前为止,我提出的最佳公式是:

char c = 'd';  // or any other hex character
int value = (((c & 0x1F) + 9) % 25;

请注意,它是无分支的,但它确实包含一个昂贵的模运算。

我可以做得更好吗?

3 个答案:

答案 0 :(得分:5)

你可以做到没有模数和没有分支,只需要几次移位和减法。

int value = (c & 0x0F) + 9 - ((c&0x10)>>1) - ((c&0x10)>>4);

我刚开始使用您的公式,并使用c&0x10 0代表字母而0x10代表0-9

请注意,正如注释中所指出的,一个常量的mod将由编译器优化乘法和加法,但这应该稍好一些,因为编译器没有c的前提条件是十六进制数字。

答案 1 :(得分:4)

(d & 0xf) + ((d & 0x40) >> 3) + ((d & 0x40) >> 6)

非常直接的小提琴。

Demo

略有不同的变体

(d & 0xf) + (d >> 6) + ((d >> 6) << 3)

保存另一个按位and操作。

两种变体基本上将第6位乘以9(与Mark Ransom的答案相同,但没有硬件乘法)。

答案 2 :(得分:4)

如果您有快速乘法可用:

int value = (c & 0x0f) + 9 * (c >> 6)