zoukankan      html  css  js  c++  java
  • 从Nginx源代码谈大写和小写字符转化的最高效代码以及ASCII码表的科学

    说起大写和小写字母转换。大家非常easy想起系统函数是不是,差点儿全部的编程语言都提供了这样的转换函数,可是你有没有想过这背后是怎么实现的?

    让你写怎么实现?


    我们都知道Nginx是眼下用的最多的Httpserver,那么他的代码相信也是最高效率的,事实也是如此,最起码我找不到比他的处理方法更好的了,假设你有欢迎告诉我。

    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

  • 相关阅读:
    jmeter4-数据库性能测试
    jmeter2-接口性能测试
    jmeter1-测试流程
    jmeter-beanshell随机取数组一项
    最强MySQL数据库设计规范... (转载)
    Python词云
    adb常用命令
    jmeter线程组多个请求之间的参数关联
    VisualVM使用与调优案例
    mysql调优工具tuning-primer.sh的使用
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6803348.html
Copyright © 2011-2022 走看看