c++ - 如果我有一个固定大小的填充 ascii 数字的字符数组,我知道它指的是一个无符号整数,那么将它转换成这样的最快方法是什么?

标签 c++ c optimization atoi

假设我有一个char buf[12];,我知道它总是有一个右对齐的无符号数,左边用空格填充。因此,例如:_________329(其中 _ 代表空格)。我能想到的最快的解析方法是这样的:

while (*buf == ' ') buf++;
atoi(buf);

但我想知道是否有更快的方法,特别是 atoi,因为我们知道它是无符号的,而 atoi 不假设......

最佳答案

我假设第一个字符是为“潜在符号”保留的,并且始终是“空格”?因为否则,您将只需要 char[11] 而不是 char[12]。无论如何,固定大小允许手动循环展开:

unsigned parse(const char(&b)[12])
{
    return ((((((((((b[1] & 15))
             * 10 + (b[2] & 15))
             * 10 + (b[3] & 15))
             * 10 + (b[4] & 15))
             * 10 + (b[5] & 15))
             * 10 + (b[6] & 15))
             * 10 + (b[7] & 15))
             * 10 + (b[8] & 15))
             * 10 + (b[9] & 15))
             * 10 + (b[10]& 15);
}

请注意,& 15 技巧对空格和零的处理方式相同,并且适用于 ASCII(空格 = 32,零 = 48)和 EBCDIC(空格 = 48,零 = 240)。我还没有检查其他字符编码:)

这实际上会比 atoi 更快还是更慢?找出答案的唯一方法是测量。但无论如何,我可能会继续使用 atoi,因为使用标准函数总能提高可读性。

关于c++ - 如果我有一个固定大小的填充 ascii 数字的字符数组,我知道它指的是一个无符号整数,那么将它转换成这样的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11477716/

相关文章:

c++ - 在 C++ 中的 iov 中存储更多数据

c++ - 创建第二个AppWindow并显示它

c# - 从 c# COM dll 返回时,C++ SAFEARRAY 具有无效数据

java - 字符串中的空终止

c - 新手 : C syntax error when compiling

无法将值输入分配的矩阵

在C中计算两个数字的GCD

algorithm - 组合优化 - 制造家具时利润最大化

c++ - 为什么链接器优化如此糟糕?

linux - 在 `perf stat` 的输出上运行 `perf record` ?