不用判断语句来进行大小写转换

前置知识:编码方案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,其他位保持不变
	}
}

总结:

首先最重要的是要观察到大小写字母二进制编码的区别,然后才能进行解决。

其实这种(利用位运算的)解决方法还有可能在别的地方运用。

参考书籍:《汇编语言》——王爽

猜你喜欢

转载自blog.csdn.net/qq_50536062/article/details/110920402