位运算实现字符的⼤⼩写转换
在⼀些编程题中,通常会有统⼀⼩写、统⼀⼤写或者⼤写转⼩写、⼩写转⼤写等操作。在上⼀篇中,介绍了java的API:s.toLowerCase(); s.toUpperCase(); 两种⽅法,但是这不⾜以让我们学习其真正的运算原理,⽽且对于 ⼤写转⼩写且⼩写转⼤写 的操作,⽤API的⽅法较为复杂。
所以,学习⽤位运算解决类似问题,可以了解运算的基本原理,更重要的是何以提⾼运算效率。
A:0100 0001
B:0100 0010
……
Z:0101 1010
a:0110 0001
b:0110 0010
……
z:0111 1010
根据字母的⼆进制ASCII码值,可以看出,第7位全为1(从右往左数),⽽字母的区别在于0-7位;仔细观察发现,⼤写的第六位全是0,⽽⼩写的第六位全是1;神奇的是, 同⼀字母的⼤写和⼩写除了第六位不同,其它位都相同。 所以要想改变⼤⼩写,需要对第六位的⼆进制做处理,第六位为1的数字是32:0010 0000,所以借助位运算符便可实现⼤⼩写转换。下⾯将逐个讲解。
⼤写变⼩写,⼩写变⼤写
格式:
字符^=32;
代码展⽰:
public String toLowerCase(String str){
char[] CharArray();
for(int i=0;i<strl.length;i++){
strl[i]=(char)(strl[i]^32);
}
return String.valueOf(strl);
}
运算原理
a:0110 0001
A:0100 0001
32:0010 0000
^(异或):相同为0,不同为1
A^32:
0100 0001
0010 0000
——————
0110 0001 = a
a^32:
0110 0001
0010 0000
——————
0100 0001 = A
统⼀⼩写
格式:
字符|=32;
代码同上⾯的类似。
运算原理:
a:0110 0001
A:0100 0001
32:0010 0000
|(或):全0为0,有1就为1
A|32:
0100 0001
0010 0000
——————
0110 0001 = a
a|32:
0100 0001
0010 0000
——————
0110 0001 =a
统⼀⼤写
格式:
字符&=-33;
代码同上⾯的类似。
运算原理:
a:0110 0001
A:0100 0001
-33:1101 1111
95:0101 1111 (根据运算原理,这⾥&95也可以)&(与):有0就为0,全1为1;
汇编语言大小写字母转换A&32:
0100 0001
1101 1111
——————
0100 0001 = A
a&32:
0100 0001
1101 1111
—————
0100 0001 = A

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。