我们知道同一个字母的大写字符和小写字符对应的 ASCII 码是不同的(如 图一),要改变一个字母的大小写,实际上就是要改变它所对应的 ASCII 码。我们将所有的字母的大写字符和小写字符所对应的 ASCII码列出来,对比一些,就很容易发现规律;
(图一)
通过对比,我们可以看出来,小写字母的 ASCII 码值比大写字母的 ASCII码值大20H(H代表16进制)。这样,我们就可以将“a”的ASCII 码值减去20H,就可以得到“A”;反之,将“A”的 ASCII 码值加上20H就可以得到“a”。这样,我们就可以使用if判断来进行大小写转换。
再仔细观察,我们还可以发现,就 ASCII 码的二进制形式来看,除第5位(位数从0开始计算)外,大写字母和小写字母的其他各位都一样。
大写字母 ASCII码的第5位为0,小写字母的第5位为1。
这样一来,我们不管大原来的字母是大写还是小写,将它的
第五位 设为0,它就将变成大写字母;
将它的第5为 设为1,它就将变成小写字母。如此一来,我们就可以通过
位运算来实现大小写转换。
代码1:
package com.flan.learn;
/**
* 不用if判断将字母进行大小写转换
* @author lynn
*/
public class ChangChar {
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer();
StringBuffer sb2 = new StringBuffer();
String s = "iPwAnDkdjhHFh";
byte[] c = s.getBytes();
for(byte b : c){
System.out.println("转换前 原始 --> "+(char)b + " 的二进制 "+ Integer.toBinaryString(b));
//转小写可以将字母与 0010 0000 进行 或运算
//java代码中不能直接使用2进制类型的 01000000,转成十进制是32
int x = b | 32;
//转大写可以将字母与 1101 1111 进行 与运算
int d = b & 223;
System.out.println("转换后 小写 --> "+(char)b + " 的二进制 "+ Integer.toBinaryString(x));
System.out.println("转换后 大写 --> "+(char)b + " 的二进制 "+ Integer.toBinaryString(d));
sb1.append((char)x);
sb2.append((char)d);
System.out.println("--------------------------------------");
}
System.out.println("转成小写 --> "+ sb1.toString());
System.out.println("转成大写 --> "+ sb2.toString());
}
}
运行结果:
转换前 原始 --> i 的二进制 1101001
转换后 小写 --> i 的二进制 1101001
转换后 大写 --> i 的二进制 1001001
--------------------------------------
转换前 原始 --> P 的二进制 1010000
转换后 小写 --> P 的二进制 1110000
转换后 大写 --> P 的二进制 1010000
--------------------------------------
转换前 原始 --> w 的二进制 1110111
转换后 小写 --> w 的二进制 1110111
转换后 大写 --> w 的二进制 1010111
--------------- 省略 -----------------
转成小写 --> ipwandkdjhhfh
转成大写 --> IPWANDKDJHHFH
转换后 小写 --> i 的二进制 1101001
转换后 大写 --> i 的二进制 1001001
--------------------------------------
转换前 原始 --> P 的二进制 1010000
转换后 小写 --> P 的二进制 1110000
转换后 大写 --> P 的二进制 1010000
--------------------------------------
转换前 原始 --> w 的二进制 1110111
转换后 小写 --> w 的二进制 1110111
转换后 大写 --> w 的二进制 1010111
--------------- 省略 -----------------
转成小写 --> ipwandkdjhhfh
转成大写 --> IPWANDKDJHHFH
声明 :本文章为读书笔记,参考《汇编语言》第二版 王爽;