大小写转换还能这样写?

简介: 大小写转换还能这样写?

今天看了一眼nginx的源码,发现里有两个字母大小写转换的宏,乍一看有点不知所云,感觉这种写法有点高级~

#define ngx_tolower(c) (char)((c >= 'A' && c <= 'Z') ? (c | 0x20) : c)
#define ngx_toupper(c) (char)((c >= 'a' && c <= 'z') ? (c & ~0x20) : c)

核心的方法是两个位运算

  • 大写转小写 c | 0x20
  • 小写转大写 c & ~0x20

在C语言里面字符是使用ASCII码来表示的,比如A对应的ASCII码是65,a对应的ASCII码是97,常规的将A变成a的方法只需要将A减去32即可,反之将a转换成A只需要加上32即可。

在这里0x20是16进制数32,是的,非常巧合,这里也是32。

c | 0x20是大写转换小写,大写字母的ASCII码会比对应的小写ASCII码要大32,所以这里的c|0x20本质上是在c的基础上加上了32。当然这样看起来不是很直观,从二进制的角度看起来就会变得很直观。

1000001  // 65 A
1100001  // 97 a
0100000  // 32 0x20

可以发现,Aa的二进制只相差一位,所以只需要改变这一位,就可以完成转换,而32对应的二进制的1恰好可以做到这一点。

|或运算可以把有差别的那一位变成1

&~ 与运算加上取反可以把有差别的那一位变成0

如果你对位运算还不是很熟,可以看一下下面这篇推文。

6002cff1ccdf88693dd631ffe9e82979_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


相关文章
|
Java
解决Java- 错误: 找不到或无法加载主类 HelloWorld.java
针对初学者使用javac,java等命令编译class文件时出现的经典问题,提供解决思路和方法。
10762 98
解决Java- 错误: 找不到或无法加载主类 HelloWorld.java
|
Java 应用服务中间件 Android开发
【Eclipse IDEA】IDEA 导入 eclipse Web项目
【Eclipse IDEA】IDEA 导入 eclipse Web项目
【开发课堂】支付宝小程序里如何使用自定义字体?
前言在小程序中为确保移动终端的通用性,官方是建议首选 PingFang SC 作为中文字体,以兼顾 Web 版和 Mobile 端。设计中字体大小与使用场景规范如下:在通配样式里字体如下:{font-style: normal;font-weight: normal;font: 0.
4399 11
【开发课堂】支付宝小程序里如何使用自定义字体?
|
Java 应用服务中间件 Maven
IDEA如何导入Eclipse项目(非Maven项目)
IDEA如何导入Eclipse项目(非Maven项目)
772 0
|
SQL DataWorks
如果源表名是小写,而DataWorks的数据集成脚本中使用的是大写表名,就会导致报错
如果源表名是小写,而DataWorks的数据集成脚本中使用的是大写表名,就会导致报错
203 1
|
9天前
|
云安全 监控 安全
|
14天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1506 8
|
7天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
499 12