从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码表:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvMjFhc3BuZXQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" />
我们仅仅关注当中的大写字母A-Z和小写字母a-z。
注意到A是65,大Z是90,小a是97。看似不经意之间,不知道有多少人想过没有,为什么Z和小a不是连续的?就是说91-96为什么要掺杂一些其它特殊字符?
事实上,这样全然不是“本来就是这样”。而是这样安排是非常科学的,见王爽《汇编语言》。已经说得非常好了:
这样做的原因就是让大写和小写互相转换非常方便,也就是能够用位运算。假设小a不是97而是91那么就不好位运算了。
10进制65的二进制是01000001
16进制的0x20的二进制就是00100000
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvMjFhc3BuZXQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" />
10进制的97二进制就是01100001,所以大写转小写就是须要把01000001与00100000相“或”就可以。
小写转大写就是将01100001变为01000001
~0x20就是按位取反。也就是0xdf,二进制就是11011111,01100001&11011111=01000001
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvMjFhc3BuZXQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" />
事实上能够得出公式:
假设A|B=C => A=C&~B
从Nginx源代码谈大写和小写字符转化的最高效代码以及ASCII码表的科学的更多相关文章
- 编写生成32位大写和小写字符的md5的函数
package nicetime.com.practise; import java.security.MessageDigest; /** * MD5加密是JAVA应用中常见的算法,请写出两个MD5 ...
- NGINX源代码剖析 之 CPU绑定(CPU亲和性)
作者:邹祁峰 邮箱:Qifeng.zou.job@gmail.com 博客:http://blog.csdn.net/qifengzou 日期:2014.06.12 18:44 转载请注明来自&quo ...
- js验证:密码只能为大写字母+小写字母+数字的8至15位字符组合
var reg = /^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[a-zA-Z0-9]{8,15}$/; // alert(password); if(reg.test(pa ...
- Excel大写和小写转换函数
Excel中的大写和小写转换函数 (1).转换为所有小写字母:lower函数 (2).转换为所有大写字母:upper函数 (3).转换为首字母大写,其余小写字母:proper函数 三种函数的使用方式. ...
- C# 字符串大写转小写,小写转大写,数字保留,其他除外
又是一道面试题,我只想到两种方式: 第一种:循环字符串,判断每个字符串的类型,再根据类型对该字符进行操作(转大写.转小写.不变或舍弃) static void Main(string[] args) ...
- JS大写转小写小写转大写,JS字符串大小写互换
Array.prototype.map.call(str,a=>a.toUpperCase(a)==a?a.toLowerCase():a.toUpperCase()).join(''); 效果 ...
- 如何将js字符串变成首字母大写其余小写
有时候会接收到一些大小写不规则的字符串,如"JAMES"."alice"."Amy"等,如何将他们统一的变成首字母大写其余小写的形式呢? 思 ...
- Python3.x:判断字符串是否为全数字、英文、大写、小写、空白字符
Python3.x:判断字符串是否为全数字.英文.大写.小写.空白字符 判断接字符串是否为数字: str = raw_input("please input the number:" ...
- Expression构建DataTable to Entity 映射委托 sqlserver 数据库里面金额类型为什么不建议用float,实例告诉你为什么不能。 sql server 多行数据合并成一列 C# 字符串大写转小写,小写转大写,数字保留,其他除外 从0开始用U盘制作启动盘装Windows10系统(联想R720笔记本)并永久激活方法 纯CSS打造淘宝导航菜单栏 C# Winform
Expression构建DataTable to Entity 映射委托 1 namespace Echofool.Utility.Common { 2 using System; 3 using ...
随机推荐
- 数据结构之--图(Graphics)
1.1:图的定义和术语 图是一种比线性表和树更为复杂的数据结构.在线性表中,数据元素之间仅有线性关系,每个元素仅有一个直接前驱和一个直接后继:在树形结构中,数据元素之间有着明显的层次关系,并且每一 ...
- i.mx53开发的一些问题
i.mx53开发的一些问题 转载于此:http://blog.csdn.net/shell_albert/article/details/8242288 原来i.mx53上4GB的Nand Fla ...
- Lex与Yacc学习(五)之正则表达式篇
正则表达式语法 lex模式是由编辑程序和实用程序使用的正则表达式的扩展版本.正则表达式由常规字符(代表它们本身)和元字符(在一种模式中具有特殊含义)组成. 元字符 . . 匹配除了换行符 \n 之外的 ...
- POJ:2406-Power Strings(寻找字符串循环节)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Description Given two strings a and b we defin ...
- “程序设计与算法训练”课程设计:“BP神经网络的实现”(C++类封装实现)
一 题目: 71 BP神经网络的实现: 利用C++语言实现BP神经网络, 并利用BP神经网络解决螨虫分类问题: 蠓虫分类问题:对两种蠓虫(A与B)进行鉴别,依据的资料是触角和翅膀的长度,已知了9支Af ...
- 关于logging模块重复问题
logger对象配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import logging # 获取一个新日志logger = ...
- SQL server 事务实例
简单的SQLserver事务实例: 执行SQL 组合操作A.操作B,只有AB都执行成功时才提交事务,否则回滚事务. 测试数据表: --1.数据表A CREATE TABLE A( A1 VARCHAR ...
- tensorflow 如何限制显存大小
Python在用GPU跑模型的时候最好开多进程,因为很明显这种任务就是计算密集型的. 用进程池好管理,但是tensorflow默认情况会最大占用显存,尽管该任务并不需要这么多,因此我们可以设置显存的按 ...
- 九度oj 题目1108:堆栈的使用
题目描述: 堆栈是一种基本的数据结构.堆栈具有两种基本操作方式,push 和 pop.Push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出.现在我们就来验证一下堆栈的使用. 输入: 对于每组测 ...
- 九度oj 题目1026:又一版 A+B
题目描述: 输入两个不超过整型定义的非负10进制整数A和B(<=231-1),输出A+B的m (1 < m <10)进制数. 输入: 输入格式:测试输入包含若干测试用例.每个测试用例 ...