前置知识:编码方案ASCII,二进制基础知识,and和or的运算规则
关于编码方案
编码方案是一套规则(表)
它约定了用什么信息来表示信息(比如用01000001来表示“a”)
(为什么需要用别的信息来表示已有信息?其实不是所有信息都能直接存储和表示,比如计算机中只有高低电平,只能生成二进制信息,如果我们不规定这些二进制信息表示什么,那它们就没有意义)
比如我想往计算机中存入小写字母“a”,而计算机中存储的信息都是二进制信息,“a”需要转化成二进制信息存入计算机中,那么它可以根据一套编码方案,将“a”转换成01000001再存进计算机中,计算机又根据这个编码方案,知道了01000001表示的是“a”。
如果计算机用的并不是这一套方案,那么它可能会把01000001解释成其他的玩意。
有编码就有解码,解码和编码一般要用同一套方案才能使信息正常表示和传递。
关于ASCII
ASCII是一套比较常用的编码方案的名称。
ASCII编码方案中,字母对应的ASCII码:
大写字母 |
二进制编码 |
小写字母 |
二进制编码 |
A |
01000001 |
a |
01100001 |
B |
01000010 |
b |
01100010 |
C |
01000011 |
c |
01100011 |
D |
01000100 |
d |
01100100 |
E |
01000101 |
d |
01100101 |
F |
01000110 |
e |
01100110 |
关于AND和OR运算的补充
AND可将操作对象(二进制表示)的任意位设为0,同时保持其他位不变
OR可将操作对象(二进制表示)的任意位设为1,同时保持其他位不变
所以如何在不用判断语句的情况下对字母进行大小写转换?
ASCII编码的情况下,可以发现大写和小写字母的二进制编码的区别只在于第5位的不同(大写字母的第五位是0,小写的是1)。
因此我们可以通过利用AND和OR运算,将第5位改变,其他位保持不变,来进行大小写转换。
c语言实现:
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "seRIoN";//需要改变的字母
int i;
printf("The original string is:");
puts(str);//打印原始字母
printf("改成大写字母后:");
for (int i = 0; i < strlen(str); i++) {
printf("%c", str[i] & 0b11011111);//用与运算,把第五位变成0,其他位保持不变
}
printf("\n");
printf("改成小写字母后:");
for (int i = 0; i < strlen(str); i++) {
printf("%c", str[i] | 0b00100000);//用或运算,把第五位变成1,其他位保持不变
}
}
总结:
首先最重要的是要观察到大小写字母二进制编码的区别,然后才能进行解决。
其实这种(利用位运算的)解决方法还有可能在别的地方运用。
参考书籍:《汇编语言》——王爽