奇技淫巧(三)—— 位运算实现大小写转换

^(1 << 5)实现大小写转换

先看”现象“:

奇技淫巧(三)—— 位运算实现大小写转换_第1张图片

奇妙吧,^(1 << 5)就能实现大小写转换。

原理:

先看ASCII码表:

奇技淫巧(三)—— 位运算实现大小写转换_第2张图片

知:

A—Z:65—90

a—z:97—122

可以看到,对于单个字符,小写比大写数值大了32,即1 << 5,如果将一个大写字符ch转化为小写,这样写就可以了:

ch = ch + (1 << 5);

同理,大写转小写:

ch = ch - (1 << 5);

但对于未知ch大小写的情况下怎么办呢?不知道该加32还是减32呢?

再来观察ASCII码表,这回看二进制位:

奇技淫巧(三)—— 位运算实现大小写转换_第3张图片

可以看到,由于A—Z:65—90,即64 + (1—26),均小于 64 + 32 = 96,即都小于:

0110 0000

这意味着,A—Z的二进制值在32这个bit位上必然是0

而a—z:97—122,可以看出,大写字母ASCII码值+32 = 对应小写字母ASCII码,即将大写字母ASCII码对应的二进制数在32这个bit位上由0换成1即可

有了这个发现就好办了,对于一个字母,大写在32这个bit位上为0,小写在32这个bit位上为1,其他bit位都一样。那么二者的转化就不用看当前字母是大写还是小写,做这样的转换就可以:如果32这个bit位上为1,则换为0,如果为0则换为1。很明显对32这个bit位取反即可,不过特定bit位取反有点麻烦,我们用”与1异或“来实现:

将1移动到对应bit位位置(<<运算符),然后和相应值进行异或。

如1 << 5 :0010 0000

这样,0和任何bit异或不改变原来bit位,1和任何bit异或相当于取反:1 ^ 0 = 1, 1 ^ 1 = 0。

 

好了,理论基础有了,直接使用^(1 << 5)就可以了,于是就有了开头说的现象:

奇技淫巧(三)—— 位运算实现大小写转换_第4张图片

参考资料:^(1 << 5)实现大小写转换

你可能感兴趣的:(经典算法题总结,奇技淫巧)