在C中实现atoi

Ada*_*dam 25 c atoi atof

我无法理解以下atoi实现代码,特别是这一行: atof

代码:

k = (k << 3) + (k << 1) + (*p) - '0';
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释一下吗?

另一个问题:atoi实施算法应该是什么?

Kar*_*ath 31

<<有点转移,(k<<3)+(k<<1)k*10由一个人写的,虽然他比编译器更聪明(好吧,他错了......)

(*p) - '0'0从指向的字符中减去p,有效地将字符转换为数字.

我希望你能弄清楚其余部分..只记得十进制系统是如何工作的.

请注意,这是一个符合标准的atoi实现.很抱歉没有引用标准,但这样可以正常工作(来自:http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/)

该函数首先丢弃尽可能多的空白字符(如在isspace中),直到找到第一个非空白字符.然后,从该字符开始,采用可选的初始加号或减号,后跟尽可能多的基数为10的数字,并将它们解释为数值.

字符串可以包含在形成整数之后的其他字符,这些字符将被忽略并且对此函数的行为没有影响.

如果str中的第一个非空白字符序列不是有效的整数,或者由于str是空的或者只包含空格字符而不存在这样的序列,则不执行转换并返回零.

  • *"他错了"* - 嗯,也许,也许不是.这取决于编译器以及何时编写所述实现.也许这是在一段时间之前编写的,当时优化编译器并不是那么好.现在没有理由回去改变它.标准库实现的编写者必须处理许多(*很多*)我们通常做的更多用例. (3认同)
  • @aroth:*"通过混淆代码来提高性能绝不是一个好主意"* - 在优化代码时,你几乎总是让一段代码更难理解,并且实际上它确实变得相当棘手(有必要发表评论)在那种情况下).有时事情确实需要非常低级别的优化,除非你有那种罕见的用户关心代码质量而不是性能,否则它说"永远不是一个好主意"只是愚蠢.我认为[Duff的设备](http://en.wikipedia.org/wiki/Duff's_device)想要聊天. (3认同)
  • 我不同意你们两个.摩尔定律在5年多前结束; cpus不再变得越来越快,它们只是获得了更多核心,这通常无法让最终用户感觉到.但是,在病态上不好的编译器不会选择通过常量执行乘法的最佳方法.将乘法乘以10作为位移不是优化; 它是作者希望编译器在特定机器上生成的汇编语言代码的表达式,这不是C应该表达的. (3认同)
  • @R .. - 万岁的分歧!尽管摩尔定律[仍然很强劲](http://www.dudegamer.com/wp-content/uploads/2011/10/Transistor_Count_and_Moores_Law_2011.gif).你是正确的*大多数*新的晶体管用于添加内核,但有些用于增加IPC的架构改进,并且流程改进允许更高的时钟速度.因此,每次迭代时单线程性能仍在提高(约10-20%).不是完整的2x,但仍然足以引起注意,并且可以通过混淆代码来实现这些和那里的收益. (2认同)

R..*_*R.. 28

k = (k << 3) + (k << 1);
Run Code Online (Sandbox Code Playgroud)

手段

k = k * 2³ + k * 2¹ = k * 8 + k * 2 = k * 10
Run Code Online (Sandbox Code Playgroud)

这有帮助吗?

*p - '0'术语增加了下一个数字的值; 这个工作,因为C要求的数字字符有连续的值,这样'1' == '0' + 1,'2' == '0' + 2

关于你的第二个问题(atof),这应该是它自己的问题,而且它是论文的主题,而不是简单的回答......