从Nginx源码谈大小写字符转化的最高效代码以及ASCII码表的科学
說起大小寫字母轉換,大家很容易想起系統函數是不是,幾乎所有的編程語言都提供了這種轉換函數,但是你有沒有想過這背后是怎么實現的?
讓你寫怎么實現?
我們都知道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码表的科学的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis安装与调试
- 下一篇: 孔雀翎----《Programming