【新书推荐】3.2节 位运算之加减乘除

本节内容:二进制移位运算,以及逻辑运算与算术运算之间的转换。任何进制的位运算本质都是一样的。

         ■二进制数移位运算:二进制数向左移位运算相当于做2的幂乘法运算,二进制数向右移位运算,相当于做2的幂除法运算。

         ■十进制数移位运算:十进制移位运算与二进制数移位运算本质相同。

         ■移位运算的应用:移位运算实现乘法或除法运算。

         ■逻辑运算的应用举例:大小写字母的转换。

         ■二进制位运算与十进制加法运算之间的关系:二进制的加法运算与十进制加法运算本质相同,分为三个步骤实现:

  1. 二进制加法运算即xor异或运算。
  2. 判断是否有进位,and与运算。
  3. 如果有进位值,进位值左移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.2节 位运算之加减乘除_第1张图片

                                                                 表3-3 ASCII码字母表

3.2.5  逻辑运算与加法运算之间的关系

例:十进制 168+934?

分为三个步骤:

第一步:加法运算;

第二步:进位运算;

第三步:进位结果左移1位,加进位值;

思考

思考:如果是十进制的计算机,可以通过位运算来实现加法运算吗?

例:  二进制1+7=?计算机怎么算(默认宽度为8位)

   0000  0001

   0000  0111 

   0000  1000

分为三个步骤:

第一步:异或运算,想当于十进制的加法运算;

第二步:与运算,相当于十进制的进位运算;

第三步:进位结果左移1位,加进位值;

计算机加法运算实现过程

【新书推荐】3.2节 位运算之加减乘除_第2张图片图3-4 计算机加法运算过程

         如图3-4所示,计算机通过三个步骤实现加法运算。

第一步由异或逻辑电路实现加法运算;

第二步由逻辑与电路判断是否产生进位;

第三步如果有进位,将进位值1左移一位;

如此循环,直至不再有进位值为止。

计算机减法运算实现过程

         例:3-4=?(默认宽度为8位)→  3+(-4)

【新书推荐】3.2节 位运算之加减乘除_第3张图片图3-5 计算机加法运算过程

如图3-5所示,计算机减法运算是加法运算的逆运算,同样可以通过逻辑异或、逻辑与和移位运算来实现。因此,早期的8086 CPU只有加法电路,但是同样可以实现减法、乘法和除法运算。

 

总结

二进制实现了逻辑运算和算术运算的统一。

计算机是通过逻辑电路实现算术逻辑运算和算术运算的。

练习

1、如何通过位运算判断一个数是奇数还是偶数?

2、如何读取二进制数中的某一位的值?

3、如何设置二进制数中的某一位的值?

4、2*8的移位法实现方式。

5、使用异或对 87AD6 进行加密后再进行解密,加解密密钥:5。

6、八进制数2-5 在计算器中的的结果是:1777777777777777777775   为什么?                                           

7、只用逻辑运算计算2-3=?(涉及内容:逻辑运算、移位、数据宽度)。

本文摘自编程达人系列教材《X86汇编语言基础教程》。

你可能感兴趣的:(《X86汇编语言程序设计》,汇编)