ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CPU原理之减法、乘法和除法

2021-11-29 02:02:01  阅读:372  来源: 互联网

标签:11 左移 123 100 余数 减法 除法 CPU


 中介绍了布尔逻辑、数学和电路的关系,我们也得到了与门、或门、非门、或非门、与非门、异或门等门电路以及一个加法器,并且了解了计算机是如何做加法的,这篇文章介绍一下计算机是如何做减法以及乘除法的。

 

 

0x01

减法

 

我们先看一下十进制里减法怎么做,存在什么问题?

457减368个位数7减8是不够减的,所以需要向十位借位,17减8等于9。5变成4,4减6又是不够减,向百位借位,14减6等于8。百位3减3等于0,结果是89。这个是我们自己计算减法时候一种很通用的方法,这种方法用计算机处理有两个问题。一个问题是借位,另一个问题是需要掌握20以内的减法。之前的机械计算机减法确实也是这么做的,不过随着历史的车轮滚滚前行,计算机的发展过程中人才辈出,还是有人发现了另外一种计算减法的简单方法-补码,成功的把减法当成了加法来处理。

 

我们来看一下,457 – 368等于457 + (1000 – 368) – 1000。1000 – 368等于632。632就是368在10进制数里的补码。457+632 = 1089,减去刚才的1000,可不就是89吗?但是这里可能有人会问计算补码不还是得计算1000减368,没解决根本问题啊。但是在二进制里,计算起来就方便多了(二进制真是化简为繁的重大发现)。其实对于一个只能计算三位数的计算机来讲,负368计算补码的正确方式999-368+1。因为三位数的计算机表示不了1000。对于二进制来讲,那就是先取反,再加一,取反用非门就可以搞定了。计算机里有符号数用高位表示符号,1是负数,0是正数,所以-1在计算机里用二进制的表示应该是1 1 1 1 1 1 1 1,对应的无符号数是255。

 

0x02

乘法

 

视频:https://zh.coursera.org/lecture/jisuanji-zucheng/402-cheng-fa-qi-de-shi-xian-lp2kEc

乘法怎么算呢?同样我们先看下十进制乘法123 * 321是怎么计算的。

 

 

123 * 321 = 123 *(3 * 100 + 2 * 10 + 1)=  (123 * 3) * 100 + (123 * 2) * 10 + 123 = 36900 + 2460 + 123 = 39483。

 

这样就转化为乘法、左移和加法操作。有的同学可能又会问,123 * 3计算机怎么算?先别动手,我们还有二进制,最终的乘法其实已经被简化为被乘数乘以10以内的数,在二进制里,那就是被乘数乘以2以内的数,2以内的数只有0和1,是不是就简单多了。我们看下11 * 12的二进制数相乘的计算过程。

 

1011 * 1100 = 1011 * 0 + 10110(1011左移一位)* 0 + 101100(1011左移两位)* 1 + 1011000(1011左移三位)* 1 。这下是不是简单多了,不是乘以0就是乘以1,最后通过加法器相加就好了。

 

public class Multiplier {
    /**
     * 模拟计算机乘法器两数相乘的过程:
     * 1.数学上m * n表示n个m相加
     * 2.但计算机乘法器是二进制的,m乘以n中第i位不为0的比特位意味着m向左移动i位,把所有这样的结果相加,即为乘法器的计算过程
     * @param m 被乘数
     * @param n 乘数
     * @return 积
     */
    public static long multiply(int m, int n) {
        if (m == 0 || n == 0)
            return 0;
 
        long result = 0;
        // 获取乘数从最高比特位往低比特位第一个不为零的比特位之间0比特位的数量
        int loop = 64 - Long.numberOfLeadingZeros(n);
        for (int i = 0; i < loop; i++) {
            if (((1 << i) & n) != 0)
                result += m << i;
        }
        return result;
    }
}

 

 

 

 

 

0x03

除法

 

乘法搞定了,就差除法了,除法怎么算呢?老规矩,我们先看下10进制123除以4的计算方法。

 

 

123 最高位1,比4小,结果是0,余数是1;

123 上一步的余数1左移1位是10,加上2是12,12除以4等于3,余数是0;

123 最后一位是3,比4小,结果是0,余数是3。

所以结果是30,余数是3。

没毛病,让我们看下二进制计算的过程。

 

 

1 1 1 1 0 1 1 中的1 比 100小,结果是0,余数是1。

1 1 1 1 0 1 1 上一步中的余数1左移1位,加上1是11,比100小,结果是0,余数是11。

1 1 1 1 0 1 1 上一步中的余数11左移1位,加上1是111,比100大,结果是1,余数是11。

1 1 1 1 0 1 1 上一步中的余数11左移1位,加上1是111,比100大,结果是1,余数是11。

1 1 1 1 0 1 1 上一步中的余数11左移1位,加上0是110,比100大,结果是1,余数是10。

1 1 1 1 0 1 1 上一步中的余数10左移1位,加上1是101,比100大,结果是1,余数是1。

1 1 1 1 0 1 1 上一步中的余数1左移1位,加上1是11,比100小,结果是0,余数是11。

 

所以结果是0011110(十进制30),余数是11(十进制数3)。

 

 

0xff

总结

 

加法是计算机中最基本的操作,我们已经有了加法器,计算加法毫无压力。减法则通过补码,巧妙的转化成了加法的运算。而乘法是通过左移和加法完成的,除法则是通过左移和减法完成的。我们通过加法器以及移位器就能完成基本的加减乘除算术运算。但是这样只能完成两个数的操作,如果想完成三个数的操作怎么办呢?总不能计算两个数,人工记录下来结果,然后再与第三个数相加吧,这就需要另外一个东西-寄存器了,有了寄存器,计算机就可以暂存一些中间结果,持续的执行代码进行计算了。下篇文章,给大家分享一下通过电路怎么记录数据。

标签:11,左移,123,100,余数,减法,除法,CPU
来源: https://www.cnblogs.com/cdaniu/p/15617368.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有