位运算对字母大小写的转换

先定义一个字符 char c; 以下讨论默认 c 为字母

我们知道小写字母的ASCII值比其大写字母的大32,因此我们通常采取下面两种方式转换字母大小写

  • c = c + 32; 把大写字母转换为小写
  • c = c - 32; 把小写字母转换为大写

我们要把 c 转换为大写字母,如果一开始我们不知道 c 为大写还是小写,要对其转换的话,我们通常需要一个 if 语句判断一下 c 的大小写 如:if(c>='a'&&c<='z') 或者if(islower(c)) ,然后才对其转换,一般需要两步。有没有更加高效的算法一步到位呢?当然是有的,而且还真和位有关,位运算!

我们先来看一眼具体操作

  • c = c | 32; 利用或运算将这个字母转化为小写字母
  • c = c & ~32; 利用与运算将这个字母转化为大写字母
  • c = c ^ 32; 利用异或运算将字母大小写互换,即大写转小写,小写转大写

这样做的原理是什么呢?我们先来看一下字母的ASCII码值

大写 十进制 二进制 小写 十进制 二进制
A 65 0100 0001 a 97 0110 0001
B 66 0100 0010 b 98 0110 0010
C 67 0100 0011 c 99 0110 0011
Z 90 0101 1010 z 122 0111 1010

通过观察我们发现,大写字母和其小写的二进制位只有在第5位(加粗部分)才出现不同,其他位都相同

因此,我们只需要改变二进制的第5位,其余位保持不变,就能实现字母大小写的转换,如何改变呢?当然得在那个不同的第5位二进制上面下功夫,利用8位二进制数0010 0000进行操作,它的十进制是32

一个字母转换为对应小写字母,把这个字母的ASCII值和32按位进行或运算

以A和a为例:

  • A(0100 0001) | 32(0010 0000) = a(0110 0001)
  • a(0110 0001) | 32(0010 0000) = a(0110 0001)

一个字母转换为对应大写字母,把这个字母的ASCII值和 ~32 按位进行与运算,~32就是对32按位取反,32(0010 0000) ——> ~32(1101 1111)

以B和b为例:

  • b(0110 0010) & ~32(1101 1111) = B(0100 0010)
  • B(0100 0010) & ~32(1101 1111) = B(0100 0010)

字母大小写互换,大写转小写,小写转大写,把这个字母的ASCII值和32按位进行异或运算

以Z和z为例:

  • Z(0101 1010) ^ 32(0010 0000) = z(0111 1010)
  • z(0111 1010) ^ 32(0010 0000) = Z(0101 1010)

看了这些推导过程,相信你一定理解了上面的操作了,你也可以编写程序验证一下结果的正确性,以加深印象。如果你还有疑惑的地方,请在下方评论里发问。

位运算对字母大小写的转换相关推荐

  1. c语言access码大小写A转换,字母大小写互相转换 ASCII码转化符号问题

    15 回复 #2 PcrazyC2007-03-13 19:33 注意{ } #3 PcrazyC2007-03-13 19:34 #include void main() { char a,c; i ...

  2. c语言大小写字母相互转化,字母大小写互相转换 ASCII码转化符号问题

    字母大小写互相转换 ASCII码转化符号问题 请问在c语言中 字母大小写互相转换怎么编写? 请问为什么 #include void main() { char a,c; int b; printf(& ...

  3. python字母大小写的转换

    python字母大小写的转换 法一 -- 函数 upper():所有字母大写 lower():所有字母小写 capitalize():字符串的首字母大写,其他字母小写 title():每个单词首字母大 ...

  4. 【java】字母大小写的转换

    [java] 字母大小写的转换 1.toLowerCase()方法. 语法如下: str.toLowerCase() //str是要转换的字符串 2.toUpperCase() 语法如下: str.t ...

  5. C语言复习——按位运算以及各种进制转换和原码、反码、补码

    第一次学习时候就似懂非懂,把主要原因归结于对二进制.十进制和十六进制这些相互转换不熟练,还有就是负数.补码什么的不太通透:再次学习还是似懂非懂,做个笔记吧,顺带把各进制.什么原码.反码补码之类的知识补 ...

  6. Python字母大小写的转换(两种方法)

    利用函数进行字母的大小写转换 upper():所有字母大写 lower():所有字母小写 capitalize():首字母大写,其他字母小写 title():每个单词首字母大写,其他小写 示例: #e ...

  7. 求水仙花数 以及 最大公约数最小公倍数 以及 冒泡法 以及字母大小写的转换 以及简单选择排序法 以及斐波那契数列

    什么是水仙花数呢? 假设一个数ABC是一个三位数. 水仙花数就是 A*A*A +B*B*B +C*C*C = ABC; 水仙花的具体代码. 接着是最大公约数以及最小公倍数 如果两个数是ab,最大公约数 ...

  8. python中字母大小写的转换,和一些字典的常规操作

    为什么80%的码农都做不了架构师?>>>    a = "who aRe You?" c = a.lower()#全小写 d = a.upper()#全大写 e ...

  9. VB作业之字母大小写的转换

    完成作业期间遇到的问题和解决的方法:运行时总是提示"代码错误"检查后发现把"text"写成了"test",改正后程序正常运行.不管做什么都应 ...

最新文章

  1. Unix的轻巧“约取而实得”(上篇)
  2. 1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区(题解第二弹)
  3. 有关计算机辅助教学方面的问题,浅析高校计算机辅助教学应用的有关问题
  4. [Android] DiffUtil在RecyclerView中的使用详解
  5. javaScript中变量作用域
  6. 【今日互联网大事儿】传百度要投资Uber呢~
  7. Portable PostgreSQL
  8. PHP移除json数据最右侧的逗号!
  9. PyTorch 1.8版本!正式支持AMD GPU
  10. 中继链路,以太网通道,DHCP配置
  11. JS引擎查找属性的原理
  12. [报告]HDU 4343 Interval query
  13. 基于java的论文查重系统设计
  14. java拼音汉字转换
  15. linux传送多个文件大小,linux统计多个文件大小总和
  16. Python--详解脚本语言|编译语言|胶水语言的区别
  17. 安装Mongodb出现2503/2502错误
  18. oracle 手机壁纸,Android修改手机壁纸功能
  19. 表格数据深度学习框架-DeepTables
  20. 采用工时表软件能为企业员工带来哪些好处

热门文章

  1. java工作之后需要看的书籍
  2. java把字体转换成位图_位图字体生成工具Bitmap Font Generator的使用
  3. 在EXCEL中取出有交集的数据列
  4. Go 语言学习总结(8)—— Go 自学者必学的教程大纲
  5. Java 反射获取Field
  6. 称闪送途中出事故 闪送员诉同城必应公司索赔
  7. 计算机网络的主要概念和功能,计算机网络的概念和基本功能是什么?
  8. java socket 短连接_socket长连接和短连接的区别
  9. c语言 通过openssl进行rsa的加密和解密
  10. 妖神记自建服务器,妖神记 - 服务退换中心 - 腾讯游戏