Python:使用位运算进行大小写转换

今天学习到了一种使用位运算进行大小写转换的方法,分享出来。
常见的英语字母大小写转换有三种需求:大小写互换、全转为小写、全转为大写。最常规的做法就是首先判断一下字符是大写字母还是小写字母,然后对应加或减大小写字母的ASCII码差值。
注意到这个固定的ASCII码差值等于32,也就是1^5,同时所有大写字母的二进制第6位都是0、小写字母的二进制第6位都是1。基于此,可以写出三种需求的位运算实现版本代码:

def convertCase_interchange(char):
    return chr(ord(char) ^ 1 << 5)


def convertCase_lowercase(char):
    return chr(ord(char) | 1 << 5)


def convertCase_uppercase(char):
    return chr(ord(char) & (1 << 7) - (1 << 5) - 1)

大小写互换等同于对第6位取反,也就是异或0b00100000;全转为小写等同于将第6位转为1,也就是或上0b00100000;全转为小写等同于将第6位转为0,也就是与上0b01011111(与上0b11011111也可以,即(1 << 8) - (1 << 5) - 1,由于字母的ASCII码第8位都是0,所以没有区别)
当然,这个方法有几个弊端:
1)对于Python这种效率很低的语言,这么优化基本没什么意义,有可能还不如传统方法,主要效率提升点可能在于可以少几次str和int的互转。Python里实际也有一些库可以做这个需求,除非是写算法题没必要自己实现。使用C/C++这种高效率、且char类型可以和数值直接运算的语言提升效果好一些。
2)必须保证输入是英文字母,否则会转换成其他奇怪的字符。当然,一般场景下这一点应该由其他模块就进行过合法性检查了。
另外就是,之前不太理解大写字母和小写字母在ASCII表里为什么不是相邻的差了26,而是正好差了32,现在算是发现这样设计的优点了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值