不用if判断将字母进行大小写转换

         我们知道同一个字母的大写字符和小写字符对应的 ASCII 码是不同的(如 图一),要改变一个字母的大小写,实际上就是要改变它所对应的 ASCII 码。我们将所有的字母的大写字符和小写字符所对应的 ASCII码列出来,对比一些,就很容易发现规律;
        (图一)
                不用if判断将字母进行大小写转换  

        通过对比,我们可以看出来,小写字母的 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,它就将变成小写字母。如此一来,我们就可以通过位运算来实现大小写转换

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());
	}
}
声明 :本文章为读书笔记,参考《汇编语言》第二版 王爽;

         转载请注明出处: OSC(csdn有同名博客)

你可能感兴趣的:(java,位运算,字符转换)