计算导论: 计算系统基本思维
前言
开学要考试啊 orz……
学校推荐预习《计算机与计算思维导论》,然而作死的我却购入了《大学计算机——计算思维导论》(因为更便宜)。作此文以梳理本蒟蒻觉得重要的地方,以试图减小开学考试对咸鱼造成的恐惧。
逻辑运算
基本逻辑运算
我们先从三种最常见的逻辑运算开始:
“与”运算 AND:逻辑乘法
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
“或”运算 OR:逻辑加法
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
“非”运算 NOT:逻辑否定
| 0 | 1 |
| 1 | 0 |
复合逻辑运算
由以上介绍的三种基本逻辑运算,我们可以组合出常见的复合逻辑运算。
“与非”运算 NAND
即先与后非。
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
“或非”运算 NOR
即先或后非。
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 0 |
“异或”运算 XOR
相同为假,相异为真。
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
“同或”运算 XNOR
相同为真,相异为假。
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
二进制与算术运算
数值表示
有大小关系的数通常采用进位制表达,即用数码和带权值的数位来表示。
进制的基本概念就不啰嗦了吧…… r进制就是逢r进1。就只记下常见进制的英文以备后用吧:
- 二进制 Binary
- 八进制 Octal
- 十进制 Decimal
- 十六进制 Hexadecimal
在计算机中我们通常采用二进制,其主要优点有:
- 二进制运算规则简单;
- 二进制算术运算可与逻辑运算实现统一,即可以用逻辑运算实现算术运算;
- 能表示两种状态的元器件容易找到,如继电器开关、灯泡、二极管/三极管等。
哦对了,唯一的重点就是十进制小数转二进制,小数部位使用乘 取整法,按顺序写出,看到循环了取最小循环数就行了……
符号表示
我们来梳理几个基本概念:
- 原码: 如果机器字长为 ,那么一个数的原码就是用一个 位的二进制数。其中最高位为符号位(正为 ,负为 )剩下的 位表示该数的绝对值。
- 反码: 对于非负整数,反码与原码一样;对于负整数,在原码的基础上,符号位不变,其他位按位取反。
- 补码: 对于非负整数,补码与原码一样;对于负整数,补码即反码 。
- 移码: 取补码并对其符号位取反。
例如,对于 位二进制:
的原码为 ,反码为 ,补码为 ,移码为 。
机器数,也就是一个在计算机中的二进制表示形式,可以用原码、反码和补码表示。若只使用原码表示,则 有两种表示方式,即 和 ,表示范围为 。但若牵扯进补码的话 就只有一种表示了,范围也就变成了 。如欲了解 C 语言中存储数字的具体方式,不妨参考上篇博文 乱谈整型与浮点。
数值运算
加法实现原理
我们不妨把加法运算分为两个部分:按位加过程 和 进位过程。
首先,我们来研究一下一位二进制的加法运算问题:
| A | B | SUM | CARRY |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
很容易发现,SUM(和) 一栏即为前面介绍到的 “异或”运算,而 CARRY(进位) 则为前面介绍到的“与”运算。
我们记 分别为第 位加数和被加数, 为第 位运算产生的进位, 为第 位运算的和, 为产生的进位,这样就可以总结出下列公式:
不考虑进位
考虑进位
减法实现原理
先对减数取负,再执行上述加法即可。
乘法实现原理
我们知道左移1位为乘以2,右移一位为除以 ,因此计算机的乘法是由加法和位移组合实现的:
除法实现原理
人类计算除法
当我们在计算 ,抛开乘法表。
- 从被除数的最高位 开始,从 选一个数,使得 且使 。我们选择了1,余数为2;
- 将余数 ,继续从 0 ~ 9 中选一个数,使得 且使 。我们选择了 ;
- 由此,我们找到了答案 。
计算机计算除法
计算机计算除法的过程与人类计算的过程很类似,只是选择范围变成了0或1。还以 为例说明( ; )
- 从第一位开始为 ,小于 ,结果位置 ;余数为
- 从第二位开始,余数 ,等于 ,结果位置 ,余数为 ;
- 从第三、四位开始,余数 ,结果位置 ,余数为 ;
- 从第 位开始,余数 ,结果位置 ,余数为 ;
- 从第 位开始,余数 ,结果位置 ,余数为 。
此时将结果位相连,恰好是 ( )。
小数点表示
可以参考上篇博文 乱谈整型与浮点中的“浮点数”部分。
编码
概念: 以若干数位或符号的不同组合来表示非数值信息的方法,是人为将若干数码或符号的每种组合钦定一种唯一的含义。
特性:
- 唯一性:每种组合都有唯一确定含义。
- 公共性:所有相关者均认同、遵守、使用该种编码。
- 规律性:具有一定规律和一定编码规则,便于计算机和人使用它。
ASCII 码、Unicode 和 GB2312-1980 不在本文中介绍,详情咨询百科。
趣题赏析
有 篇大新闻,其中一篇是长者的,香港记者只要报道了长者的新闻生命就会在 内被续掉,问至少要多少名香港记者才能在 内鉴别出长者的新闻?
鬼才想得到计算思维……
🐷:这还不简单, 名就够啦。
😏:猪就是蠢, 名不就行啦。
🤓:其实 名就够了。这其实是一个二进制转十进制问题。我们以 代表记者存活, 代表记者被续。给记者编号 ;给新闻编号 。
- 让 号记者报道新闻 ( );
- 让 号记者报道新闻 ( );
- 让 号记者报道新闻 ( );
- 让 号记者报道新闻 ( );……依此类推,直到最后让 号记者报道所有的奇数新闻( )。
后,将 号记者的生存情况排列成一个二进制数,将其转换为 进制,即为长者新闻编号。
例如,假设 号新闻是长者的,那么根据上述步骤得到的二进制数即为:
还没懂?
那我们这样想,二进制数转十进制数的过程是不是对二进制数的每一位(第 位)乘以 并求和。若 v号记者最终被续,那么长者新闻的编号自然含有 ,同理,若8号记者被续则必然含有 …… 现在明白了吧。
为什么这样想?
篇新闻,有一篇是能送命的,无非意味着一共仅有
种状态。我们只要找出一种方法能够表示这种状态就可以了——比如
位二进制就是一个不错的选择(状压 DP 入门?)。
参考文献
- 战德臣、聂兰顺等 - 《大学计算机——计算思维导论》
- 战德臣老师在中国大学MOOC上的在线课程
- 点奇 - 数字逻辑电路 逻辑运算 与、或、非、与非、或非、与或非、异或、同或
- 刘水镜 - 原码、反码、补码和移码其实很简单
- 匿名用户 - 计算机怎么计算,具体工作原理是什么?
- 小橋流水 - 一道关于计算机如何做加法的面试题
- 中华胡杨的专栏 - 计算机计算乘除法的原理