从Nginx源码谈大小写字符转化的最高效代码以及ASCII码表的科学
說起大小寫字母轉(zhuǎn)換,大家很容易想起系統(tǒng)函數(shù)是不是,幾乎所有的編程語言都提供了這種轉(zhuǎn)換函數(shù),但是你有沒有想過這背后是怎么實(shí)現(xiàn)的?
讓你寫怎么實(shí)現(xiàn)?
我們都知道Nginx是目前用的最多的Http服務(wù)器,那么他的代碼相信也是最高效率的,事實(shí)也是如此,最起碼我找不到比他的處理方法更好的了,如果你有歡迎告訴我。
nginx源碼有這樣一段宏,用來做大小寫字母的轉(zhuǎn)換:
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)
很明顯人家用了位運(yùn)算,但是為什么這樣就可以呢?
先看AscII碼表:
我們只關(guān)注其中的大寫字母A-Z和小寫字母a-z。
注意到A是65,大Z是90,小a是97。看似不經(jīng)意之間,不知道有多少人想過沒有,為什么Z和小a不是連續(xù)的?就是說91-96為什么要摻雜一些其他特殊字符?
其實(shí),這樣完全不是“本來就是這樣”。而是這樣安排是很科學(xué)的,見王爽《匯編語言》,已經(jīng)說得很好了:
這樣做的原因就是讓大小寫互相轉(zhuǎn)換很方便,也就是可以用位運(yùn)算,如果小a不是97而是91那么就不好位運(yùn)算了。
10進(jìn)制65的二進(jìn)制是01000001
16進(jìn)制的0x20的二進(jìn)制就是00100000
10進(jìn)制的97二進(jìn)制就是01100001,所以大寫轉(zhuǎn)小寫就是需要把01000001與00100000相“或”即可。
小寫轉(zhuǎn)大寫就是將01100001變?yōu)?1000001
~0x20就是按位取反,也就是0xdf,二進(jìn)制就是11011111,01100001&11011111=01000001
其實(shí)可以得出公式:
如果A|B=C?? =>?? A=C&~B
總結(jié)
以上是生活随笔為你收集整理的从Nginx源码谈大小写字符转化的最高效代码以及ASCII码表的科学的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis安装与调试
- 下一篇: 我们的誓言是什么歌啊