在刷算法或者日常编码的过程中,经常会遇到英文字母的大小写转的问题,一般都是先判断一个字母的ASCII码值是在65-90之间还是在91-122之间,随后在调用toLowerCase()函数和toUpperCase()函数进行转换,我们称其为函数法,就像这样(Java):
![](https://i-blog.csdnimg.cn/blog_migrate/e48cf7c87613c8d30f1bd309b9cd7d34.png)
这样只转换一次还好,如果次数多的话,(比如LeetCode 784.字母大小写全排列) 。
为了防止代码变得臃肿不堪,我们可以采用二进制的方式,无需判断就可以进行转换,这个叫它二进制法,就像这样:
![](https://i-blog.csdnimg.cn/blog_migrate/1cc21fdb43b6b7d25a07e678b9789746.png)
这样使代码更简洁明了,那原理是什么?
因为大小写字母在 ASCII 表中相差 32 位(即 1 << 5),
我们所以只需要将他们的二进制数的第 6 位 0 变 1,1 变 0 即可。
例如 A = 65 = 0100 0001,a = 97 = 0110 0001,可以看到他们只有第 6 位不同。
而 0 变 1,1 变 0 可以用「异或 1 」来实现。即0 ^ 1 = 1,1 ^ 1 = 0。
所以,无需判断其原来是大写还是小写就能实现大写变小写、小写变大写,
且适用于所有编程语言。