我正在寻找最快的方法来获取十六进制 ASCII 字符的十进制值,即保证出现在以下字符串中的字符(可以是小写或大写,但不能有空格):
0123456789ABCDEFabcdef
到目前为止,我想出的最好的公式是:
char c = 'd'; // or any other hex character
int value = (((c & 0x1F) + 9) % 25;
请注意,它是无分支的,但它确实包含一个昂贵的模运算。
我可以做得更好吗?
最佳答案
您可以在没有模数和分支的情况下完成它,只需几个移位和减法。
int value = (c & 0x0F) + 9 - ((c&0x10)>>1) - ((c&0x10)>>4);
我刚刚从你的公式开始,并使用了这样一个事实,即 c&0x10
对于字母将是 0
而对于 0- 将是
。0x10
9
请注意,正如评论中指出的那样,编译器会针对乘法和加法优化常量模数,但这应该会稍微好一些,因为编译器没有 c
为十六进制数。
关于algorithm - 解码十六进制数字的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33925589/