日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

从Nginx源码谈大小写字符转化的最高效代码以及ASCII码表的科学

發布時間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从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码表的科学的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。