平常我们在写转换字符串大小写的算法时,一般的思路就是先依次判断单个字符的 ASCII 码值:位于 45~90 的为字母的大写,转换成对应的小写就是+32;位于 97~122 的为字母的小写,转换成对应的大写就是-32。

其实还有一种更加简单的方法,利用的原理就是大小写之间相差 32,即转换成 2 进制之后第五位为 1 则为小写第五位为 0 则为大写

举个例子就懂了:

‘A’:ASCII 码为 65,二进制:0100 0001‬

‘a’:ASCII 码为 97,二进制:0110 0001

‘M’:ASCII 码为 77,  二进制:0100 1101‬

‘m’:ASCII 码为 109,二进制:0110 1101

发现了没,小写与大写之间的二进制只有第五位(第 0 位开始)相反,大写第五位为 0,相应的小写第五位为 1。所以我们完全可以利用这个特点来很容易的转换大小写,代码如下:

/***************************************************
函数功能:转换单个字符为大写
函数参数:需要转换的单个字符,大小写都可以,就是这么强
函数返回值:输入的单个字符的大写
***************************************************/
char UppercaseConvert(char c)
{
     return c & 0xDF; //第五位无论大小写,&上0xDF都会转换成相应的大写
}

/***************************************************
函数功能:转换单个字符为小写
函数参数:需要转换的单个字符,大小写都可以,还是这么强
函数返回值:输入的单个字符的小写
***************************************************/
char LowercaseConvert(char c)
{
     return c | 0x20; //第五位无论大小写,|上0x20都会转换成相应的小写
}

给大家一个完整的示例:

#include <stdio.h>
#include <string.h>

char UppercaseConvert(char c)
{
     return c & 0xDF; //第五位无论大小写,&上0xDF都会转换成相应的大写
}

char LowercaseConvert(char c)
{
     return c | 0x20; //第五位无论大小写,|上0x20都会转换成相应的小写
}

int main(int argc, char *argv[]) {
     char *a = "sdfsdfgdtFFEGEFggg";
     char *aa = a; //再定义一个aa是方便大家在这个程序中同时看到两种转换
     while(*a) //不为空说明字符串还没完
     {
          printf("%c", UppercaseConvert(*a));
          a++;
     }
     printf("\r\n");  //加个换行,增加美感~
     while(*aa)
     {
          printf("%c", LowercaseConvert(*aa));
          aa++;
     }

     return 0;
}

程序运行结果如下(不骗大家的):c5713d2055ed61b93f321c5a7439cb5e.png

最后,喜欢作者的欢迎关注我们的公众号

"脑补空间

会为大家推送更多推文~

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐