您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
064第十一章 位运算01(新版)
发布时间:2021-05-09 16:45:18编辑:雪饮阅读()
实现大小写转换
这道题其实很简单,有好几种做法。
我们都知道大写字母A-Z的编码是65-90,小写字母的编码a-z是97-112。
首先先看这张图片:
![大小写.png](/d/file/xuewuzhijing/xindebiji/87b2319ab94ba8c054c249f2292b00ce.png)
由图中的表格可以观察得出:
很直观可以看出,大写字母和小写字母的ASCII码值相差32;
通过仔细观察相应的二进制,可以得出大写字母和小写字母二进制的第5位(从右往左从0开始数)正好相反。这也恰恰印证了第一点的ASCII码值相差32。
所以可得出以下结论:
大小写是由二进制的第5位来区分的。
第5位为1即为小写,第5位为0即为大写
因此可以利用比如按位与保持其他位不变而只改变该位即可。
letter &= 223, 即按位与二进制 1101 1111(为了第五位故意造一个二进制,这个二进制转换为10进制正好是223), 全部变大写
letter |= 32,即按位或二进制 0010 0000(同理也是为了第五位故意造一个二进制),全部变小写
则具体实现如:
#include <stdio.h>
#include <conio.h>
void main()
{
char ch, temp;
printf("请输入一个字母: \n");
ch = getchar();
/*
A:65
z:122
Z:90
a:97
*/
while( !(((ch>='A') && (ch<='z')) || ((ch >= 'Z') && (ch <= 'a'))) )
{
printf("输入有误, 请重新输入一个字母: \n");
ch = getchar();
}
/*
&:按位与,两个二进制位都是1,结果为真
十进制:
a:97
A:65
32:100000
*/
if( ch & 32 )
{
// 使第五位为0,变大写
/*
223:
11011111
*/
ch = ch & 223;
}
else
{
// 使第五位为1,变小写
ch = ch | 32;
}
putchar(ch);
printf("\n");
}
则编译运行结果如:
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
请输入一个字母:
a
A
D:\cproject>m.exe
请输入一个字母:
A
A
关键字词:位,大小写