今天看王爽老师的《汇编语言》时,很有收获,不论是技术还是思考方式。
任务是将字符串进行大小写转换,但是还暂时不会用分支判断语句(而且这样的效率也不是最高的,有点类似于高级语言了)。
“如果一个问题的解决方法,使我们陷入一种矛盾之中。那么,很可能是我们考虑问题的出发点有了问题,或是说,我们起初运用的规律并不适合。”(强行被王老师灌了一碗鸡汤,爽!)
扯点淡:这两天正好遇到一点事情,使我略微开始怀疑自己,(当然也没那么严重,卓教授可是非常厉害的,承载了太多期许的目光,岂能轻言放弃。不能把世界交给我看不起的人!),所以王老师的这句话使我,换一种思考方式,也许会柳暗花明。
初步想法是,判断字符的ASCII码,如果大于61H,则减20H。但是没有判断语句,所以这条道走不通。
我们应该重新观察,寻找新的规律。可以看出,就ASCII码的二进制形式来看,除第5位(位数从0开始计算)外,大写字母和小写字母的其他各位都一样。大写字母ASCII码的第5位为0,小写字母的第5位为1。这样,我们就有了新的方法,一个字母,不管他原来是大写还是小写,将他的第5位置0,他就必将变为大写字母;将他的第5位置1,他就必将变为小写字母。在这个方法中,我们不需要在处理前判断字母的大小写。
果然,奇技淫巧...
代码如下:
assume cs:code, ds:data
data segment
db 'BaSiC'
db 'iNfOrMaTiOn'
data ends
code segment
start:
mov ax, data
mov ds, ax  ;设置ds指向data段
mov bx, 0   ;设置(bx)=0,ds:bx指向'BaSiC'的第一个字母
mov cx, 5   ;设置循环次数
s1:
mov al, [bx]      ;将ASCII码从ds:bx所指向的单元中取出
and al, 11011111B ;将al中的ASCII码的第5位置为0,变为大写字母
mov [bx], al      ;将转变后的ASCII码写回原单元
inc bx      ;(bx)加1,ds:bx指向下一个字母
loop s1
mov bx, 5   ;设置(bx)=5,ds:bx指向'iNfOrMaTiOn'的第一个字母
mov cx, 11  ;设置循环次数,因为'iNfOrMaTiOn'有11个字母
s2:
mov al, [bx]
or al, 00100000B  ;将al中的ASCII码的第5位置为1,变为小写字母
mov [bx], al
inc bx
loop s2
mov ax, 4c00h
int 21h
code ends
end start
在以后的操作中,可以从更底层的角度看看能否通过位运算来实现,效率更高,结果更精准。

巧用位运算实现大小写转换相关推荐

  1. c语言 整数转二进制取位,C语言位运算--将整数转换成二进制串以及反转整数后N位...

    // c primer plus上的内容,位运算 #include char * itobs (int n,char * ps); void show_bstr(const char *); int ...

  2. 计算机系统-理论-CPU操作/处理数据的方式/寻址方式/局部性原理/位运算/进制转换

    在计算机中,cpu将一切硬件,都看成内存,各种硬件在CPU的眼中都是下面这样子的 CPU对硬件的操作,其实就是和这些硬件的内存或者BIOS进行交互,CPU能做且只能做三件事 1.将某个地址中存储的字节 ...

  3. 位运算-将二进制转换成十六进制

    背景 将二进制数转换成十六进制的表现形式.(就是在获取32位二进制的每四位,拿到二进制的最低四位) 实现 代码实现 public static void BitCalc() {//获取60的二进制Sy ...

  4. 神奇的位运算——进制转换问题(16转8)

    说道位运算符,应该都了解,但是很少有人会用,在网上看别人的代码,我至今只见过一道题用到了位运算符,并被它深深的搞晕了(当然,他搞晕我是要负责的,我现在已经深深的迷上了他,真的是太神奇了),位运算符的原 ...

  5. 位运算转换二进制【进制转换】

    普通十进制转换二进制: 1.通过不断 %2 和 /2 得到用 1 0表示的数存进数组 但是得到的是倒序 2.将数组里面的值倒序输出再存入新的数组即可(其他进制转换同理) 但是这种方法复杂且代码较长 # ...

  6. 求余运算转换为位运算

    因为求余运算要用到除法,除法是比较费时的.因此高性能的程序需要对求余进行转换. 如果被求余数是2的整数次幂,可以用位运算来进行转换,从而得到比较高的效率. 例如求 n % 32 = ??? 可以将其转 ...

  7. excel二进制移位运算_Excel揭秘13:在Excel中实现位运算

    我们知道,计算机使用的是二进制计数法.也就是说,在计算机中的所有信息都是使用二进制来存储和处理的. 下表列出了我们熟悉的十进制数及与其相对应的二进制数: 位运算规则 在位运算中,"按位与&q ...

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

    位运算对字母大小写的转换 先定义一个字符 char c; 以下讨论默认 c 为字母 我们知道小写字母的ASCII值比其大写字母的大32,因此我们通常采取下面两种方式转换字母大小写 c = c + 32 ...

  9. C++ OJ 中多行数据输入(大小写转换、通过移位运算实现2的n次方、多组输入,每行输入数量不一样)

    1. 多组输入,输出每行最大值 while(cin>>a>>b) 主要解决的是两个为一组的多组数据输入,当一次只输入一个数据时就用 while(cin>>a) 输入 ...

最新文章

  1. Ubuntu命令行连接wifi热点
  2. FileSystem close Exception
  3. 释放锁的逻辑-InterProcessMutex.release
  4. html中选择省份城市,省份、城市、区县三级联动Html代码
  5. firefox使用掘金插件_Mozilla发布新的附加组件来修复旧版Firefox中的扩展禁用问题...
  6. string 方法 java_java中常用的String方法
  7. python3.5.2环境下安装对应版本的opencv2(2019.1.25测试成功)
  8. IDEA使用@Data注解,类调用get、set方法标红的解决办法
  9. MFC中如何在CMainFrame类中访问CxxxView视图类中的成员
  10. getset原子性 redis_对比各类分布式锁缺陷,抓住Redis分布式锁实现命门
  11. 《集成电路先进光刻技术与版图设计优化》课程分享之一:典型显微系统的光学成像原理
  12. notepad++ 免安装版,下载,汉化
  13. 带图像识别的YYS连点器 V2.0
  14. uniapp开发微信公众号调用微信授权登录
  15. Deepin Linux禁用笔记本自带键盘
  16. oracle回收DBA权限以及授权表空间
  17. 服务器支持 TLS Client-initiated 重协商攻击(CVE-2011-1473复现验证)
  18. python批量添加姓名生成奖状批量处理图片教师学生奖状
  19. 面向对象的C++了解
  20. 【Linux】IRQ

热门文章

  1. 苹果又来割韭菜?一块擦屏布卖145元,这玩意到底是不是智商税?
  2. QQ伤感日志_你教会了我爱,让我懂得了爱
  3. 利用人脸微笑数据集训练识别模型,完成对人脸图片微笑识别
  4. recon-ng模块安装与基本使用(国内环境)
  5. 《SpringBoot2.0 实战》系列-整合FlyingSaucer + thymeleaf 实现模板文件转pdf打印
  6. Android中相册的实现
  7. 逻辑运算符,if、swtch语句(java基础知识三)
  8. MSP430系列单片机的DMA使用全面认识
  9. 口头禅多多......
  10. [redis]Redis ZSet排序问题(排名实现按时间顺序排布)