今天看了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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/286706.html
標籤:其他
下一篇:網路編程基礎知識 htons(), ntohl(), ntohs(),htons(),inet_add(),inet_ntoa(),大小端法
