字母的大小写互换其实很简单
回到最基本的数据的存储形式,从八位二进制角度去看大写字母和小写字母,你会发现它们的低四位是相同的,高四位有细微差别。
举例:
ASCII | DEC | BIN |
---|---|---|
‘A’ | 65 | 01000001 |
‘a’ | 97 | 01100001 |
‘B’ | 66 | 01000010 |
‘b’ | 98 | 01100010 |
‘X’ | 88 | 01011000 |
‘x’ | 120 | 01111000 |
仔细观察 发现是第六位不同!
大小写互换的方法
- 考虑到低四位完全相同 只用互换高四位的第六位就可以实现大小写互换
互换高四位的某一位而不改变低四位,我们联想到位运算中的按位异或
^
关于按位异或 详见按位异或由按位异或的知识,我们可以寻找一个数,使得任意的一个八位二进制数与它进行异或操作后,高四位的第六位01取反,低四位不变
回顾我们的目标 假如把
'A'
变为'a'
我们需要把01000001
变为01100001
,也就是把第六位的0
变为1
。我们找到这个数了!它的二进制是
00100000
十进制是32
01000001^00100000=01100001
,是不是很神奇?同理把小写字母'a'
变为'A'
也只需要把它与32进行按位异或操作就可以啦~
#include<stdio.h>
int main(){
int i;
char s[100];
//读入字符串
gets(s);
for(i=0;s[i]!='\0';i++)
{
if((s[i]>='A'&&s[i]<='Z')||(s[i]>='a'&&s[i]<='z'))
s[i]^=32;//核心语句,实现字符串中字母的大小写互换
}
printf("%s",s);
return 0;
}
样例输入->
Hello,Java!
样例输出->
hELLO,jAVA!