大小写转换还能这样写?

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

今天看了一眼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


相关文章
大小写转换
原文:大小写转换 using System.Text.RegularExpressions;     string s = (12345678901234567890.123456789).
845 0
|
9月前
345.反转字符串中的元音字母
345.反转字符串中的元音字母
43 0
字符替换
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/45768797 编制一个字符替换函数rep(char *s,char *s1,char *s2),实现将已知字符串s中所有属于字符串s1中的字符都用字符串s2中的对应字符代替。
468 0
WHERE 何时使用引号
WHERE 何时使用引号
133 0

热门文章

最新文章