学习记录-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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值