在C中将hex转换为整数最快的方法是什么?

我试图尽可能快地将十六进制字符转换为整数.

这只是一行:
int x = atoi(hex.c_str);

有更快的方法吗?

在这里,我已经尝试了一种更加动态的方法,它稍微快一些.

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:

06002

2.由Christophe提出的紧凑型

06003

3.修正三进制运算符版本,处理大写字母输入,由g24l提出:

06004

4.查找表(unordered_map):

06005

其中table是先前显示的无序映射.

5.查找表(用户constexpr文字):

06005

其中表是用户定义的文字,如上所示.

实验设置

我定义了一个将输入十六进制字符串转换为整数的函数

06007

我还定义了一个使用随机十六进制字符串填充字符串向量的函数

06008

我创建了分别填充50000,100000,150000,200000和250000随机十六进制字符串的向量.然后对于每个算法,我运行100个实验并对时间结果进行平均.

编译器是GCC版本5.2,具有优化选项-O3.

结果:

讨论

从结果我们可以得出结论,对于这些实验设置,提出的表方法超出所有其他方法.尽管if-else方法胜过if-else方法,但是与其他提出的方法相比,if-else方法是最差的,因为它是unordered_map.

CODE

编辑:

stgatilov提出的方法的结果,按位操作:

06009

编辑:

我也测试了g24l的原始代码与表的方法

060010

请注意,此方法不处理大写字母A,B,C,D,E和F.

结果:

仍然表方法呈现更快.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...