本节内容:二进制移位运算,以及逻辑运算与算术运算之间的转换。任何进制的位运算本质都是一样的。
■二进制数移位运算:二进制数向左移位运算相当于做2的幂乘法运算,二进制数向右移位运算,相当于做2的幂除法运算。
■十进制数移位运算:十进制移位运算与二进制数移位运算本质相同。
■移位运算的应用:移位运算实现乘法或除法运算。
■逻辑运算的应用举例:大小写字母的转换。
■二进制位运算与十进制加法运算之间的关系:二进制的加法运算与十进制加法运算本质相同,分为三个步骤实现:
- 二进制加法运算即xor异或运算。
- 判断是否有进位,and与运算。
- 如果有进位值,进位值左移1位,继续做进位值的加法运算,直到没有进位为止。
3.2.1 二进制数移位运算
■左移(进位):各二进位全部左移若干位,高位丢弃,低位补0。
举例
shl(<<) 1101 1000 左移2位为:0110 0000 。
0000 0001<<1==0000 0010 2 相当于1*21,结果为2。
0000 0001<<2==0000 0100 4 相当于1*22,结果为4。
0000 0001<<3==0000 1000 8 相当于1*23,结果为8。
1111 1111=27 +26 +25+ 24 + 23 +22 +21 + 20 =128+64+32+16+8+4+2+1=255。
■右移(借位):各二进位全部右移若干位,低位丢弃,高位补0或者补符号位。
举例
1.8位无符号整数右移。
shr(>>) 1101 1000 右移2位为:0011 0110。
15D 0000 1111>>1==0000 0111 7 移出0001 相当于15/2,商为7,余数1。
15D 0000 1111>>2==0000 0011 3 移出0011 相当于15/4,商为3,余数3。
15D 0000 1111>>3==0000 0001 1 移出0111 相当于15/8,商为1,余数7。
2.8位有符号整数4右移1位,即 4/2=2。
二进制数右移:0000 0100 右移1位,正整数高位补符号位0,结果为0000 0010B。
3.8位有符号整数-4右移1位,即 -4/2=-2。
第一步:计算-4的补码。
原码:1000 0100
反码:1111 1011
补码:1111 1100
第二步二进制数右移:1111 1100 右移1位,正整数高位补符号位1,结果为1111 1110B。
3.2.2 十进制数移位运算
在上一章中我们强调过任何进制的算术逻辑运算本质上都是相同的。以此推论,二进制数移位运算和十进制数移位运算也应该是相同的。
举例
10进制数11左移2位,1100,空位补0,等于11*102。
10进制数11右移2位,0.11,空位补0,等于11/102 。
3.2.3 移位运算的应用
如果计算机没有乘法电路和除法电路时,可以用移位和加法运算来实现乘法和除法运算。在以后的代码示例和练习中,我们会经常使用移位运算来代替乘法或除法运算,特别是2的幂运算时,比较简单便捷。此处不再赘述。
3.2.4 逻辑运算的应用举例
举例
大写字母和小写字母的转换。如表3-3所示,在ASCII码表中大写字母和小写字母是有规律的,大写字母对应的ASCII值+20h,就是小写字母。我们也可以使用逻辑运算的方法进行大小写字母的转换。
大写A转换为小写a的算法:第5位置1,or运算。
小写a转换为大写A的算法:第5为置0,and运算。
01000001 A
or 00100000
01100001 a
表3-3 ASCII码字母表
3.2.5 逻辑运算与加法运算之间的关系
■例:十进制 168+934?
分为三个步骤:
第一步:加法运算;
第二步:进位运算;
第三步:进位结果左移1位,加进位值;
思考
思考:如果是十进制的计算机,可以通过位运算来实现加法运算吗?
■例: 二进制1+7=?计算机怎么算(默认宽度为8位)
0000 0001
0000 0111
0000 1000
分为三个步骤:
第一步:异或运算,想当于十进制的加法运算;
第二步:与运算,相当于十进制的进位运算;
第三步:进位结果左移1位,加进位值;
■计算机加法运算实现过程
图3-4 计算机加法运算过程
如图3-4所示,计算机通过三个步骤实现加法运算。
第一步由异或逻辑电路实现加法运算;
第二步由逻辑与电路判断是否产生进位;
第三步如果有进位,将进位值1左移一位;
如此循环,直至不再有进位值为止。
■计算机减法运算实现过程
例:3-4=?(默认宽度为8位)→ 3+(-4)
图3-5 计算机加法运算过程
如图3-5所示,计算机减法运算是加法运算的逆运算,同样可以通过逻辑异或、逻辑与和移位运算来实现。因此,早期的8086 CPU只有加法电路,但是同样可以实现减法、乘法和除法运算。
总结
二进制实现了逻辑运算和算术运算的统一。
计算机是通过逻辑电路实现算术逻辑运算和算术运算的。
练习
1、如何通过位运算判断一个数是奇数还是偶数?
2、如何读取二进制数中的某一位的值?
3、如何设置二进制数中的某一位的值?
4、2*8的移位法实现方式。
5、使用异或对 87AD6 进行加密后再进行解密,加解密密钥:5。
6、八进制数2-5 在计算器中的的结果是:1777777777777777777775 为什么?
7、只用逻辑运算计算2-3=?(涉及内容:逻辑运算、移位、数据宽度)。
本文摘自编程达人系列教材《X86汇编语言基础教程》。