ASCII码表字母排列的妙处

今天无意间看到一篇文章。说大小写字母之间的转换。
然后提到了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);
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值