字母有32个,大写的A是65,小写的a是97,A和a之间的差是32
那么大写转小写也就是+32,小写转大写也就是-32
做一道题:将字符串str = “HDhsUkOPjsdYnLmAqKSMvc” 转化为小写。
我们写一下逻辑
for(int i=0;i<str.Length();i++){
if(str[i]是大写)
就转化为小写
}
这样做显然是可以的,但是在这个过程中需要判断Length次,那么有没有一点优美一点的办法呢?
进步的过程其实就是我们一步步追求优美的过程。
如果我们把包含大写和小写的所有字母都转化成二进制的话会发现:所有的小写的第五位(从0开始)是1,所有的大写字母的第五位都是0。
----------------------------------------------------------------------------------------------------------------------
大写 十六进制 二进制 小写 十六进制 二进制
A 41 01000001 a 61 01100001
B 42 01000010 b 62 01100010
C 43 01000011 c 63 01100011
D 44 01000100 d 64 01100100
E 45 01000101 e 65 01100101
..
..
..
----------------------------------------------------------------------------------------------------------------------
32写成二进制是 00100000
+32 其实就是将二进制的第五位置位1
-32 其实就是讲二进制的第五位置位0
那么我们的新思路就是无论这个字符是大写还是小写,我们只需要将其二进制码的第五位变为0或者是1。而与运算和或运算能完成这个完美的操作。
使用 | 运算
01000001 (a)
| 00100000
----------------------------
01100001 (A)
使用 & 运算
01100001 (A)
& 11011111
-----------------------------
01000001 (a)