在C中有什么替代strtoull()函数吗?

时间:2015-10-24 17:01:44

标签: c algorithm casting type-conversion

我需要将char*转换为unsigned long long intstrtoull()标准库中有一个名为C的函数,但需要很长时间。我需要在char*unsigned long long int之间快速转换。如何编写比标准转换函数更快的转换函数?

2 个答案:

答案 0 :(得分:4)

我现在能想到的最短/最快的代码:

unsigned long long strtoull_simple(const char *s) {
  unsigned long long sum = 0;
  while (*s) {
    sum = sum*10 + (*s++ - '0');
  }
  return sum;
}

没有错误检查。配置文件以查找是否可以提高性能。 YMMV。

接受后:尝试将初始计算变为unsigned的变体,然后继续unsigned long long。我的64位计算机的边缘到负面改进取决于设置的数量。怀疑在unsigned long long操作费用昂贵的机器上它会更快。

unsigned long long strtoull_simple2(const char *s) {
  unsigned sumu = 0;
  while (*s) {
    sumu = sumu*10 + (*s++ - '0');
    if (sumu >= (UINT_MAX-10)/10) break;  // Break if next loop may overflow
  }
  unsigned long long sum = sumu;
  while (*s) {
    sum = sum*10 + (*s++ - '0');
  }
  return sum;
}

如果代码知道字符串的长度,那么以下内容有一些性能改进(5%)

unsigned long long strtoull_2d(const char *s, unsigned len) {
  unsigned sumu = 0;
  #define INT_MAX_POWER_10 9
  if (len > INT_MAX_POWER_10) {
    len = INT_MAX_POWER_10;
  }
  while (len--) {
    sumu = sumu * 10 + (*s++ - '0');
  }
  unsigned long long sum = sumu;
  while (*s) {
    sum = sum * 10 + (*s++ - '0');
  }
  return sum;
}

结论:对简单原始解决方案的改进(我试过7)可以产生小的增量速度效率,但它们变得越来越依赖于平台和数据集。建议编程人才更好地应用于更高级别的代码改进。

答案 1 :(得分:1)

修改为使用unsigned long long的@ Answer

soerium提供的效果优于strtoull()

unsigned long long  fast_atoull(const char *str)
{
    unsigned long long val = 0;
    while(*str)
    {
        val = (val << 1) + (val << 3) + (*(str++) - 48);
    }
    return val;
}