從Nginx源碼談大小寫字元轉化的最高效代碼以及ASCII碼錶的科學,nginxascii

來源:互聯網
上載者:User

從Nginx源碼談大小寫字元轉化的最高效代碼以及ASCII碼錶的科學,nginxascii

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.