位运算对字母大小写的转换
位运算对字母大小写的转换
先定义一个字符 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)
看了这些推导过程,相信你一定理解了上面的操作了,你也可以编写程序验证一下结果的正确性,以加深印象。如果你还有疑惑的地方,请在下方评论里发问。
位运算对字母大小写的转换相关推荐
- c语言access码大小写A转换,字母大小写互相转换 ASCII码转化符号问题
15 回复 #2 PcrazyC2007-03-13 19:33 注意{ } #3 PcrazyC2007-03-13 19:34 #include void main() { char a,c; i ...
- c语言大小写字母相互转化,字母大小写互相转换 ASCII码转化符号问题
字母大小写互相转换 ASCII码转化符号问题 请问在c语言中 字母大小写互相转换怎么编写? 请问为什么 #include void main() { char a,c; int b; printf(& ...
- python字母大小写的转换
python字母大小写的转换 法一 -- 函数 upper():所有字母大写 lower():所有字母小写 capitalize():字符串的首字母大写,其他字母小写 title():每个单词首字母大 ...
- 【java】字母大小写的转换
[java] 字母大小写的转换 1.toLowerCase()方法. 语法如下: str.toLowerCase() //str是要转换的字符串 2.toUpperCase() 语法如下: str.t ...
- C语言复习——按位运算以及各种进制转换和原码、反码、补码
第一次学习时候就似懂非懂,把主要原因归结于对二进制.十进制和十六进制这些相互转换不熟练,还有就是负数.补码什么的不太通透:再次学习还是似懂非懂,做个笔记吧,顺带把各进制.什么原码.反码补码之类的知识补 ...
- Python字母大小写的转换(两种方法)
利用函数进行字母的大小写转换 upper():所有字母大写 lower():所有字母小写 capitalize():首字母大写,其他字母小写 title():每个单词首字母大写,其他小写 示例: #e ...
- 求水仙花数 以及 最大公约数最小公倍数 以及 冒泡法 以及字母大小写的转换 以及简单选择排序法 以及斐波那契数列
什么是水仙花数呢? 假设一个数ABC是一个三位数. 水仙花数就是 A*A*A +B*B*B +C*C*C = ABC; 水仙花的具体代码. 接着是最大公约数以及最小公倍数 如果两个数是ab,最大公约数 ...
- python中字母大小写的转换,和一些字典的常规操作
为什么80%的码农都做不了架构师?>>> a = "who aRe You?" c = a.lower()#全小写 d = a.upper()#全大写 e ...
- VB作业之字母大小写的转换
完成作业期间遇到的问题和解决的方法:运行时总是提示"代码错误"检查后发现把"text"写成了"test",改正后程序正常运行.不管做什么都应 ...
最新文章
- Unix的轻巧“约取而实得”(上篇)
- 1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区(题解第二弹)
- 有关计算机辅助教学方面的问题,浅析高校计算机辅助教学应用的有关问题
- [Android] DiffUtil在RecyclerView中的使用详解
- javaScript中变量作用域
- 【今日互联网大事儿】传百度要投资Uber呢~
- Portable PostgreSQL
- PHP移除json数据最右侧的逗号!
- PyTorch 1.8版本!正式支持AMD GPU
- 中继链路,以太网通道,DHCP配置
- JS引擎查找属性的原理
- [报告]HDU 4343 Interval query
- 基于java的论文查重系统设计
- java拼音汉字转换
- linux传送多个文件大小,linux统计多个文件大小总和
- Python--详解脚本语言|编译语言|胶水语言的区别
- 安装Mongodb出现2503/2502错误
- oracle 手机壁纸,Android修改手机壁纸功能
- 表格数据深度学习框架-DeepTables
- 采用工时表软件能为企业员工带来哪些好处