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

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

总结

 

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

【基础知识】CPU原理之减法、乘法和除法的更多相关文章

  1. 风炫安全WEB安全学习第十九节课 XSS的漏洞基础知识和原理讲解

    风炫安全WEB安全学习第十九节课 XSS的漏洞基础知识和原理讲解 跨站脚本攻击(Cross-site scripting,通常简称为XSS) 反射型XSS原理与演示 交互的数据不会存储在数据库里,一次 ...

  2. [汇编] 002基础知识-CPU和寄存器

    CPU是什么 当然这里的内存不仅仅指电脑上的内存,例如:我的金士顿8G内存,七彩虹1G独显,在这里来说,显卡也是有内存的(寄存器) CPU如何控制其它部件的? 问题:CPU是如何和电脑主机中其它芯片有 ...

  3. 【Mail】邮件的基础知识和原理

    电子邮件概念 电子邮件是-种用电子手段提供信息交换的通信方式,是互联网应用最广的服务.通过网络的电子邮件系统,用户可以以非常低廉的价格(不管发送到哪里,都只需负担网费).非常快速的方式(几秒钟之内可以 ...

  4. MySQL基础知识

    一.MySQL安装 MySQL的下载 http://dev.mysql.com/downloads/mysql/ MySQL版本选择 MySQL功能自定义选择安装 1.功能自定义选择 2.路径自定义选 ...

  5. 编程必备基础知识|计算机组成原理篇(09):CPU的控制器和运算器

    计算机基础方面的知识,对于一些非科班出身的同学来讲,一直是他们心中的痛,而对于科班出身的同学,很多同学在工作之后,也意识到自身所学知识的不足与欠缺,想回头补补基础知识.关于计算机基础的课程很多,内容繁 ...

  6. IM开发基础知识补课:正确理解前置HTTP SSO单点登陆接口的原理

    1.前言 一个安全的信息系统,合法身份检查是必须环节.尤其IM这种以“人”为中心的社交体系,身份认证更是必不可少. 一些PC时代小型IM系统中,身份认证可能直接做到长连接中(也就是整个IM系统都是以长 ...

  7. 菜鸟脱壳之脱壳的基础知识(二) ——DUMP的原理

    菜鸟脱壳之脱壳的基础知识(二)——DUMP的原理当外壳的执行完毕后,会跳到原来的程序的入口点,即Entry Point,也可以称作OEP!当一般加密强度不是很大的壳,会在壳的末尾有一个大的跨段,跳向O ...

  8. IM开发基础知识补课(七):主流移动端账号登录方式的原理及设计思路

    1.引言 在即时通讯网经常能看到各种高大上的高并发.分布式.高性能架构设计方面的文章,平时大家参加的众多开发者大会,主题也都是各种高大上的话题——什么5G啦.AI人工智能啦.什么阿里双11分分钟多少万 ...

  9. Java多线程原理+基础知识(超级超级详细)+(并发与并行)+(进程与线程)1

    Java多线程 我们先来了解两个概念!!!! 1.什么是并发与并行 2.什么是进程与线程 1.什么是并发与并行 1.1并行:两个事情在同一时刻发生 1.2并发:两个事情在同一时间段内发生 并发与并行的 ...

随机推荐

  1. 分享一个学习cesiumjs的中文社区

    在cesiumjs中文社区的时间线中我写到: 2018年10月10日 注册用户数51,日uv破100 Mark截图 2018年06月22日 上线测试 2018年06月19日 获得cesiumcn.or ...

  2. Gradle下载安装教程

    前言 1.gradle和maven一样都是用来构建java程序的,maven2004年开始兴起,gradle2012年开始诞生,既然已经有了maven这么成熟的构建工具为什么还有gradle的诞生呢, ...

  3. gin中绑定uri

    package main import ( "github.com/gin-gonic/gin" "net/http" ) type Person struct ...

  4. lvs的三种模式

    一.NAT模式(VS-NAT) 原理:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此RS来处理,RS处理完成后把数据交给经过负载均衡器,负载均衡器再把数 ...

  5. ansible command和shell的区别

    1.command模块不支持管道符和变量等,如果要使用这些,需要shell模块. 2.在使用ansible中的时候,默认的模块是-m command,从而模块的参数不需要填写,直接使用即可

  6. iptables规则管理

    查看规则 iptables -t filter -L INPUT -n -v --line  省略-t选项时,表示默认操作filter表中的规则 添加规则 注意点:添加规则时,规则的顺序非常重要  - ...

  7. tigergao--shell

    #!/bin/bash #@date:2019-11-28 #@auth:tigergao #@update_all function depprot() { curdir=`dirname $0` ...

  8. JavaIo流入门篇之字节流基本使用。

    一 基本知识了解(  字节流, 字符流, byte,bit是啥?) /* java中字节流和字符流之前有接触过,但是一直没有深入的学习和了解. 今天带着几个问题,简单的使用字节流的基本操作. 1 什么 ...

  9. 一条SQL更新语句是如何执行的

    文章首发于公众号「蝉沐风」,认真写好每一篇文章,欢迎大家关注交流 这是图解MySQL的第2篇文章,这篇文章会通过一条SQL更新语句的执行流程让大家清楚地明白: 什么是InnoDB页?缓存页又是什么?为 ...

  10. AT2043 [AGC004C] AND Grid

    首先可以发现一个很简单的想法,因为最外层是一定不会有 \(\#\) 的,所以可以考虑让第一个网格图将每个连通块的最外层包起来,第二个网格图将就选择这个包内部的所有点即可. 但你发现这个想法是很难实现的 ...