学习记录-c语言-大小写转换问题理解和记录

Posted Hero_HL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习记录-c语言-大小写转换问题理解和记录相关的知识,希望对你有一定的参考价值。

今天看了ffpaly源码,在源码中看到一段很有意思的函数(大写转换小写,小写转换大写)。觉得很有意思,故而写下对它的理解

源码如下libavutil\\avstring.h

/**
 * Locale-independent conversion of ASCII characters to uppercase.
 */
static inline av_const int av_toupper(int c)
{
    if (c >= 'a' && c <= 'z')
        c ^= 0x20;
    return c;
}

/**
 * Locale-independent conversion of ASCII characters to lowercase.
 */
static inline av_const int av_tolower(int c)
{
    if (c >= 'A' && c <= 'Z')
        c ^= 0x20;
    return c;
}

理解如下:
0x20 = 0010 0000
然后找到A、Z、a、z对应的ASCII码
在这里插入图片描述

A:65	   =	0100 0001	
A ^ 0x20 = 	
0010 0000 ^
0100 0001 =
0110 0001	(不同为1,相同为0)	= 97 = a


a:97	 =  0110 0001
a ^ 0x20 = 	
0010 0000 ^ 
0110 0001 = 
0100 0001 = 65 = A

97与65相差32对应 0x20,异或上0x20后,第六位变号,要不增加32(第六位为0),要不就减少32(第六位为1)

A~Z 对应 65~90 (第六位都是0)
	对应 0100 0001 ~ 0101 1010
a~z	对应 97~122 (第六位都是1)
	对应 0110 0001 ~ 0111 1010

故而A ~ Z异或上0x20实则都是增加0x20,而a ~ z异或上0x20实则都是减少0x20

以上是关于学习记录-c语言-大小写转换问题理解和记录的主要内容,如果未能解决你的问题,请参考以下文章

C++11学习记录:核心语言功能特性

C++11学习记录:核心语言功能特性

C++11学习记录:核心语言功能特性

C++11学习记录:核心语言功能特性

关于CSS的个人理解

javascript学习笔记全记录