在C中将hex转换为整数最快的方法是什么?
我试图尽可能快地将十六进制字符转换为整数.
这只是一行: 有更快的方法吗? 在这里,我已经尝试了一种更加动态的方法,它稍微快一些. int hextoint(char number) { if (number == '0') { return 0; } if (number == '1') { return 1; } if (number == '2') { return 2; } /* * 3 through 8 */ if (number == '9') { return 9; } if (number == 'a') { return 10; } if (number == 'b') { return 11; } if (number == 'c') { return 12; } if (number == 'd') { return 13; } if (number == 'e') { return 14; } if (number == 'f') { return 15; } return -1; } 解决方法
提出比OP更快的解决方案if-else:
>无序地图查找表 如果您的输入字符串始终为十六进制数,则可以将查找表定义为unordered_map: std::unordered_map<char,int> table { {'0',0},{'1',1},{'2',2},{'3',3},{'4',4},{'5',5},{'6',6},{'7',7},{'8',8},{'9',9},{'a',10},{'A',{'b',11},{'B',{'c',12},{'C',{'d',13},{'D',{'e',14},{'E',{'f',15},{'F',{'x',{'X',0}}; int hextoint(char number) { return table[(std::size_t)number]; } >查找表作为用户constexpr文字(C 14) 或者如果您想要更快速的东西而不是unordered_map,您可以使用新的C 14工具与用户文字类型,并在编译时将表定义为文字类型: struct Table { long long tab[128]; constexpr Table() : tab {} { tab['1'] = 1; tab['2'] = 2; tab['3'] = 3; tab['4'] = 4; tab['5'] = 5; tab['6'] = 6; tab['7'] = 7; tab['8'] = 8; tab['9'] = 9; tab['a'] = 10; tab['A'] = 10; tab['b'] = 11; tab['B'] = 11; tab['c'] = 12; tab['C'] = 12; tab['d'] = 13; tab['D'] = 13; tab['e'] = 14; tab['E'] = 14; tab['f'] = 15; tab['F'] = 15; } constexpr long long operator[](char const idx) const { return tab[(std::size_t) idx]; } } constexpr table; constexpr int hextoint(char number) { return table[(std::size_t)number]; } Live Demo 基准: 我使用Nikos Athanasiou编写的代码运行基准测试,该代码最近在isocpp.org发布,作为C微型基准测试的一种方法. 比较的算法有: OP的原始if-else:
2.由Christophe提出的紧凑型
3.修正三进制运算符版本,处理大写字母输入,由g24l提出:
4.查找表(unordered_map):
其中table是先前显示的无序映射. 5.查找表(用户constexpr文字):
其中表是用户定义的文字,如上所示. 实验设置 我定义了一个将输入十六进制字符串转换为整数的函数:
我还定义了一个使用随机十六进制字符串填充字符串向量的函数:
我创建了分别填充50000,100000,150000,200000和250000随机十六进制字符串的向量.然后对于每个算法,我运行100个实验并对时间结果进行平均. 编译器是GCC版本5.2,具有优化选项-O3. 结果: 讨论 从结果我们可以得出结论,对于这些实验设置,提出的表方法超出所有其他方法.尽管if-else方法胜过if-else方法,但是与其他提出的方法相比,if-else方法是最差的,因为它是unordered_map. CODE 编辑: stgatilov提出的方法的结果,按位操作:
编辑: 我也测试了g24l的原始代码与表的方法:
请注意,此方法不处理大写字母A,B,C,D,E和F. 结果: 仍然表方法呈现更快. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |