我正在寻找获得十六进制ASCII字符的十进制值的最快方法,即保证出现在以下字符串中的一个(它可以是小写或大写,但没有空格):
0123456789ABCDEFabcdef
到目前为止,我提出的最佳公式是:
char c = 'd'; // or any other hex character
int value = (((c & 0x1F) + 9) % 25;
请注意,它是无分支的,但它确实包含一个昂贵的模运算。
我可以做得更好吗?
答案 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)
非常直接的小提琴。
略有不同的变体
(d & 0xf) + (d >> 6) + ((d >> 6) << 3)
保存另一个按位and
操作。
两种变体基本上将第6位乘以9(与Mark Ransom的答案相同,但没有硬件乘法)。
答案 2 :(得分:4)
如果您有快速乘法可用:
int value = (c & 0x0f) + 9 * (c >> 6)