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
时间: 2024-10-06 00:37:54