从Nginx源码谈大小写字符转化的最高效代码以及ASCII码表的科学
发布日期:2021-06-30 19:20:12 浏览次数:2 分类:技术文章

本文共 834 字,大约阅读时间需要 2 分钟。

说起大小写字母转换,大家很容易想起系统函数是不是,几乎所有的编程语言都提供了这种转换函数,但是你有没有想过这背后是怎么实现的?

让你写怎么实现?

我们都知道Nginx是目前用的最多的Http服务器,那么他的代码相信也是最高效率的,事实也是如此,最起码我找不到比他的处理方法更好的了,如果你有欢迎告诉我。

nginx源码有这样一段宏,用来做大小写字母的转换:

nginx-1.6.1/src/core/ngx_string.h   47-48行

#define ngx_tolower(c)      (u_char) ((c >= 'A' && c <= 'Z') ? (c | 0x20) : c)#define ngx_toupper(c)      (u_char) ((c >= 'a' && c <= 'z') ? (c & ~0x20) : c)

很明显人家用了位运算,但是为什么这样就可以呢?

先看AscII码表:

我们只关注其中的大写字母A-Z和小写字母a-z。

注意到A是65,大Z是90,小a是97。看似不经意之间,不知道有多少人想过没有,为什么Z和小a不是连续的?就是说91-96为什么要掺杂一些其他特殊字符?

其实,这样完全不是“本来就是这样”。而是这样安排是很科学的,见王爽《汇编语言》,已经说得很好了:

这样做的原因就是让大小写互相转换很方便,也就是可以用位运算,如果小a不是97而是91那么就不好位运算了。

10进制65的二进制是01000001

16进制的0x20的二进制就是00100000

10进制的97二进制就是01100001,所以大写转小写就是需要把01000001与00100000相“或”即可。

小写转大写就是将01100001变为01000001

~0x20就是按位取反,也就是0xdf,二进制就是11011111,01100001&11011111=01000001

其实可以得出公式:

如果A|B=C   =>   A=C&~B

转载地址:https://linuxstyle.blog.csdn.net/article/details/41251915 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:JavaScript 读写文件
下一篇:Redis安装与调试

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年05月01日 05时54分52秒