假设我有一个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/