从Nginx源码谈大小写字符转化的最高效代码以及ASCII码表的科学
2014-11-18 19:43
507 查看
说起大小写字母转换,大家很容易想起系统函数是不是,几乎所有的编程语言都提供了这种转换函数,但是你有没有想过这背后是怎么实现的?
让你写怎么实现?
我们都知道Nginx是目前用的最多的Http服务器,那么他的代码相信也是最高效率的,事实也是如此,最起码我找不到比他的处理方法更好的了,如果你有欢迎告诉我。
nginx源码有这样一段宏,用来做大小写字母的转换:
nginx-1.6.1/src/core/ngx_string.h 47-48行
很明显人家用了位运算,但是为什么这样就可以呢?
先看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
让你写怎么实现?
我们都知道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
相关文章推荐
- 从Nginx源代码谈大写和小写字符转化的最高效代码以及ASCII码表的科学
- 正则表达式:转化字符匹配大小写
- @V@ java代码笔记2010-06-12:java控制台输入各类型类实现;以及判断输入字符串里面是否有数字的两种方法:方法1:转换成字符数组;方法2:正则表达式。
- Nginx源码分析系列3:根据时间转化成年月日时分秒的函数
- C++字符的大小写转化
- Eclipse中导入Cococs2d-x源码的Classes文件夹以及代码的自动补全
- 请问Lab->RGB, RGB->LAB的颜色转化方法,以及代码,或者有什么参考书籍,谢谢
- c++的字符串char与string相互转化,以及string的,切割,替换字符,字符串拼接方法(object向c++转型系列教程2)
- 关于字符串中数字字符转化为数字 sscanf的使用以及strchr的使用
- oracle提供的关于数值或字符与其用于实际存储到硬盘上的编码值间以及不同进制的数值间的转化方法的总结[收集中]
- 企业网站架构之Nginx详解原理以及工作模块;源码Lnmp架构
- 开源我的代码生成器以及数据库文档生成器(附截图和源码)
- 小工具:将中文字符转化为URL放到网页中,再取到手机服务器端转化为中文(JAVA代码)
- LDD3源码分析之字符设备驱动程序(加上测试代码)
- java---字符串操作(分割,大小写转化,去除首末空格,截取字串,转化成字符数组)
- 源码包安装 NGINX时候遇到的错误以及解决办法!
- Nginx (一)Windows下编译Nginx源码以及安装 nginx for windows方法步骤
- 使用sql server的存储过程来讲中文汉字转化为拼音字符的代码实例教程
- 关于MultiByteToWideChar与WideCharToMultiByte代码测试(宽字符与多字节字符的转换)以及字符串的转换代码测试
- 字符串操作,去重复以及字符转化字符串