学习记录-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语言-大小写转换问题理解和记录的主要内容,如果未能解决你的问题,请参考以下文章