今天无意间看到一篇文章。说大小写字母之间的转换。
然后提到了ASCII码表的排列并不是偶然。
先来看看一个小程序。
public class Demo {
public static void main(String[] args) {
for(int a = 'A';a<='z';a++){
System.out.printf("%c:",a);
System.out.println(Integer.toBinaryString(a));
}
}
}
这个程序的输出结果是:
A:1000001
B:1000010
C:1000011
D:1000100
E:1000101
F:1000110
G:1000111
H:1001000
I:1001001
J:1001010
K:1001011
L:1001100
M:1001101
N:1001110
O:1001111
P:1010000
Q:1010001
R:1010010
S:1010011
T:1010100
U:1010101
V:1010110
W:1010111
X:1011000
Y:1011001
Z:1011010
[:1011011
\:1011100
]:1011101
^:1011110
_:1011111
`:1100000
a:1100001
b:1100010
c:1100011
d:1100100
e:1100101
f:1100110
g:1100111
h:1101000
i:1101001
j:1101010
k:1101011
l:1101100
m:1101101
n:1101110
o:1101111
p:1110000
q:1110001
r:1110010
s:1110011
t:1110100
u:1110101
v:1110110
w:1110111
x:1111000
y:1111001
z:1111010
忽略掉中间非字母部分。你会发现字母的二进制有一些规律:
- 所有大写字母的倒数第6位都是0
- 所有小写字母的倒数第6位都是1
- 所有大写字母和小写字母之间只有倒数第6位不同
根据这些规律很容易找到大小写字母之间转换更快的算法。
注:0100000
的十六进制为 0x20
。
'A' | 0x20 = 'a'
'a' & ~0x20 = 'A'
不仅仅转换可以利用这个规律。判断大小写一样可以用到。
bool isUpper(char c){
return !(c & 0x20);
}
bool isLower(char c){
return (c & 0x20);
}