在C语言中,我们想要输出一个字符,其实是需要对应ASCII值。查ASCII不难发现,A-Z和a-z差值都是32,那么是否有快速将大写字母转换成小写字母的方式呢?
答案肯定是有的,比如说调用isupper()和islower()判断,然后进行转换。但是我们学过汇编就知道,数值相差32正是数据的第五位是否是1,也就是0010 0000,我们可以直接利用这个特点来进行改变。
大写字母 | ASCII | 二进制值 | 小写字母 | ASCII | 二进制值 |
---|---|---|---|---|---|
A | 65 | 0100 0001B | a | 97 | 0110 0001B |
B | 66 | 0100 0010B | b | 98 | 0110 0010B |
C | 67 | 0100 0011B | c | 99 | 0110 0011B |
注意:位数是从0-7,而不是1-8
如果是大写字母,我们想要转换成小写字母可以将第五位置1即可。
实现代码:
#include<stdio.h>
int main()
{
char str[]="ABCDefgHIJKimnOPQrstUVWxyz";
int i=0;
while(str[i]!='\0')
{
str[i]=str[i]|0b00100000;//32=0010 0000B
i++;
}
printf("%s\n",str);
return 0;
}
输出结果:
如果是小写字母,我们想要转换成大写字母可以将第五位置0即可。
实现代码:
#include<stdio.h>
int main()
{
char str[]="ABCDefgHIJKimnOPQrstUVWxyz";
int i=0;
while(str[i]!='\0')
{
str[i]=str[i]&0b11011111;//223=1101 1111B
i++;
}
printf("%s\n",str);
return 0;
}
输出结果: