声明:这些内容主要是面向C语言的初学者,尤其是正在学习C语言的学生。
在读王爽老师的《汇编语言》时,看到了用and 和or指令处理字母大小写转换的例子。and 和or是汇编语言中按位与和按位或操作的指令,对应C语言中的&和|操作。本文把这个例子的C语言版在这里重复一下,以便理解和扩充位运算的应用。
我们知道大小写字母的ASCII码值差32,因此我们通常采用直接加减32的方法来进行大小写字母的转换。如果要用位运算来操作,则必须先从大小写字母的ASCII码值的二进制形式入手。下表列出了部分字母的大小写的ASCII码值的二进制形式。
|
大写 |
十六进制 |
二进制 |
小写 |
十六进制 |
二进制 |
|
A |
41 |
01000001 |
a |
61 |
01100001 |
|
B |
42 |
01000010 |
b |
62 |
01100010 |
|
C |
43 |
01000011 |
c |
63 |
01100011 |
|
D |
44 |
01000100 |
d |
64 |
01100100 |
|
E |
45 |
01000101 |
e |
65 |
01100101 |
|
F |
46 |
01000110 |
f |
66 |
01100110 |
仔细观察上表的两列二进制形式,可以发现这样的规律:除第5位外(位数从0开始计算),大写字母和小写字母的其他各位都一样,大写字母的第5位为0,小写字母的第5位为1。因此,对于一个字母,不管原来是大写还是小写,将其第5位置0,它就必将变成大写字母;将其第5位置1,它就必将变成小写字母。下面的程序将两个大小写混合的字符串分别转换为大写和小写字母串。
//用位运算实现大小写字母转换
#include "stdio.h"
int main()
{
int i=0;
char a[6]="BaSiC";
char b[6]="MinIX";
do
{
a[i] = a[i] & 0xDF; //将第5位置0
b[i] = b[i] | 0x20; //将第5位置1
i++;
}
while(i<5);
printf("a = %s\nb = %s\n",a,b);
}

389

被折叠的 条评论
为什么被折叠?



