计算机导论

数制转换

各种进制数的表示方法

二进制后缀是B,或者右下角标2

  • 1101B,(1101)2

八进制后缀是O,或者右下角标8

  • 1234O,(1234)8

十进制后缀是D,或者右下角标10,可省略

  • 1357D,(1357)10,1357

十六进制后缀是H,或者右下角标16

  • 1E5FH,(1E5F)16

数制间的转换

十进制到二进制

整数部分除 2 取余( 从下向上

(83)10=(1010011)2

83/2=41 **余 ** 1

41/2=20 **余 ** 1

20/2=10 **余 ** 0

10/2=5 0

5/2=2 1

2/2=1 0

1 1

将余数从下往上(从最后一个余数到第一个余数)依次排列,得到二进制数:1010011

小数部分×2取整数(从上向下)

将0.8125转换为二进制小数,逐次乘2取整

(0.8125)10=(0.1101)2

0.8125*2=1.625

0.625*2=1.25

0.25*2=0.5

0.5*2=1

将每次得到的整数部分从上到下依次排列,得到二进制小数部分:0.1101

二进制到十进制:利用展开公式

根据公式:
$$
B = b_{n-1}2^{n-1} + b_{n-2}2^{n-2} + \dots + b_12^1 + b_02^0 + b_{-1}2^{-1} + \dots + b_{-m}2^{-m}
$$
例如:
$$
(1101.01)2 = 1 \times 2^3 + 1 \times 2^2 + 0 \times 2^1 + 1 \times 2^0 + 0 \times 2^{-1} + 1 \times 2^{-2} = (13.25){10}
$$

十进制转换其他进制,先转化为二进制再按表格替换

  • 注二进制统一补为 4 位,方便和十六进制(1 位对应 4 位二进制)、八进制(1 位对应 3 位二进制)的换算理解。

0-15 十进制、二进制、八进制、十六进制转换表

十进制(Decimal) 二进制(Binary) 八进制(Octal) 十六进制(Hexadecimal)
0 0000 00 0
1 0001 01 1
2 0010 02 2
3 0011 03 3
4 0100 04 4
5 0101 05 5
6 0110 06 6
7 0111 07 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F

减法是通过加负数的补码求得结果的补码,会使用以上规则描述计算过程。

模板题:

  • 用补码加法运算实现837-1008的运算过程。(设计算机字长为16位)

先求837,1008原码(转化为二进制,其余位补0)

(837)原码=(0000001101000101)

(837)补码=(0000001101000101) (正数的补码就是原码)

(1008)原码=(0000001111110000)

(1008)补码=(0000001111110000)

(-1008)原码=(1000001111110000) (负数的原码就是把正数的第一位换成1)

(-1008)补码=(1111110000010000) (负数的补码:原码第一位不变,从右往左数到第一个1不变(包括第一个1)其余位取反)

(837-1008)真值=(-171)

(837-1008)原码=(1000000010101011)

(837-1008)补码=(1111111101010101)

汉字编码

题目: 某汉字的区位码是 3240(十进制),请写出它的国标码和机内码(用十六进制表示)。

  1. 区位码分别转十六进制:

    拆分区位码(6位16进制数):(区码(4位)+位码(2位))

    区码=32

    位码=40

    32→20H

    40→28H

    即2028H

  2. 求国标码:

    国标码 = 区位码(十六进制) + 2020H(区码、位码分别加 20H)。

    2028H+2020H=4048H

  3. 求机内码:

    机内码 = 国标码 + 8080H(区码、位码分别加 80H)

    4048H+8080H=C0C8H

地址重定位

题目: 在页式存储管理中,页面大小为 1KB。某进程的逻辑地址为 2500。查页表得知,该逻辑页对应的物理块号(页框号)为 5。请计算物理地址。

核心公式: 物理地址=物理块号*页面大小+页内偏移量

​ 页内偏移量=逻辑地址%页面大小

  1. 页面大小:1 KB=1024 B

    逻辑地址:2500

    物理块号:5

  2. 页内偏移量=2500 % 1024=2500−2×1024=2500−2048=452

  3. 物理地址=5*1024+452=5572

IP地址

IPv4 地址分类 - 首字节范围及属性对照表

地址类别 首字节十进制范围 二进制特征(前 n 位) 默认子网掩码 典型用途
A 类 0 - 127 首位为 0 255.0.0.0 大型网络(如国家级骨干网、大型运营商网络)
B 类 128 - 191 前两位为 10 255.255.0.0 中型网络(如企业内网、高校校园网)
C 类 192 - 223 前三位为 110 255.255.255.0 小型网络(如家庭网络、小型办公室、分支网点)
D 类 224 - 239 前四位为 1110 无(不划分网络 / 主机位) 组播通信(如视频会议、流媒体广播、网络设备组管理)
E 类 240 - 255 前四位为 1111 无(不划分网络 / 主机位) 科研实验、未来网

题目: 给定IP地址 192.168.10.55
(1) 它属于哪一类IP地址?
(2) 写出它的默认子网掩码。
(3) 写出它的主机号。

  1. 类别: 首字节192,属于 C类(192-223)。
  2. 子网掩码: C类默认掩码是 255.255.255.0
  3. **主机号:**主机号的计算规则是:IP 地址二进制 与 子网掩码反码 进行按位与运算
  • 子网掩码 255.255.255.0 的反码为:00000000.00000000.00000000.11111111

  • 按位 与运算:将 IP 二进制和子网掩码反码逐位做与运算(只有对应位都为 1 时结果为 1,否则为 0)

IP二进制: 11000000.10101000.00001010.00110111

掩码反码: 00000000.00000000.00000000.11111111

按位与结果: 00000000.00000000.00000000.00110111

  • 转换为十进制

0.0.0.55

冯诺依曼体系结构基本思想

  1. 数据以二进制表示。

  2. 存储器是按地址访问的线性编址的一维结构,每个单元的位数是固定的。

  3. 采用存储程序方式,指令和数据不加区别混合存储在同一个存储器中。

  4. 指令由操作码和操作数地址组成。

  5. 通过执行指令直接发出控制信号控制计算机。

  6. 运算器为中心,I/O设备与存储器间的数据传送都要经过运算器。

指令的执行过程

寄存器中文名

  1. PC (Program Counter):程序计数器
    • 作用:存放下一条要执行的指令的地址(自动 + 1)。
  2. IR (Instruction Register):指令寄存器
    • 作用:存放当前正在执行的指令。
  3. MAR / AR (Memory Address Register):地址寄存器
    • 注意:图 1 叫 MAR,图 2 叫 AR,它俩是一个东西。
    • 作用:存放要访问的存储单元的地址。
  4. MDR / DR (Memory Data Register):数据寄存器
    • 注意:图 1 叫 MDR,图 2 叫 DR,也是一个东西。
    • 作用:存放从内存读出或写入内存的数据 / 指令。
  5. ALU (Arithmetic Logic Unit):算术逻辑单元
    • 作用:负责加减乘除和逻辑运算。
  6. ACC / GPRs:累加器 / 通用寄存器组
    • 作用:存放运算的操作数或结果。
  7. ID (Instruction Decoder):指令译码器
    • 作用:分析指令是干什么的(图 2 中有标出,图 1 含在控制器里)。

描述指令的执行过程

这个过程分为三个阶段:取指、译码、执行

1. 取指阶段 (Fetch) —— 把指令从内存搬到CPU

  • (1) PC 将指令地址送给 MAR (地址寄存器)。
  • (2) MAR 将地址送给 存储器,控制器发出“读”信号。
  • (3) 存储器 将该地址处的指令读出,送给 MDR (数据寄存器)。
  • (4) MDR 将指令内容送给 IR (指令寄存器)。
  • (5) PC 自动加1,指向下一条指令。

2. 译码阶段 (Decode) —— 搞清楚要干嘛

  • IR 将指令的操作码送给 指令译码器 (ID),控制器分析出这是一条什么指令(例如是加法还是存数)。

3. 执行阶段 (Execute) —— 干活(以加法为例)

  • 控制器根据译码结果,向 ALU 和其他部件发出控制信号。
  • 如果有操作数在内存,再次通过 MARMDR 取出数据。
  • ALU 完成运算,将结果写回 寄存器 (ACC/GPRs)存储器

简化流程:

PC →→ MAR →→ 内存 →→ MDR →→ IR

总线

按位置分类

片内总线,片总线,内总线,外总线

按传输信息分类

地址总线,数据总线,控制总线

微机采用的三级存储方式

高速缓存,主存,外存

中断

题目: CPU在执行程序时,被外部突发事件打断,转而去处理该事件,处理完后又回到原程序断点处继续执行。(概念)请写出中断处理过程的六个步骤。

中断请求→中断判优→中断响应→中断处理→中断返回

作用: 提高效率、提高响应速度、提高健壮性

进程

三种基本状态

  • 就绪态:获得除处理器外的所有资源
  • 运行态:占用处理器资源
  • 阻塞态:等待某种条件

临界资源与临界区

  1. 临界资源: 一次仅允许一个进程使用的共享资源(如打印机)。
  2. 临界区: 进程中访问临界资源的那段代码(注意:临界区是代码,不是区域)。

进程的互斥与同步(P/V操作)

  • 互斥(Mutual Exclusion): 是指多个进程竞争同一个资源(如打印机),为了防止冲突,同一时刻只允许一个进程使用。
  • 同步(Synchronization): 是指多个进程为了完成同一个任务,需要按先后顺序配合执行。“协同工作”的关系.

信号量(Semaphore)的数值计算

  • 公式: P(S)=S-1,V(S)=S+1
  • S>0:表示可用资源的数量。
  • S=0:表示资源刚好用完,没人等待。
  • S<0:S的绝对值表示**正在等待(阻塞)**的进程数。

设信号量S的初值为5,若有8个进程先后对S执行P操作,那么最后S的值是多少?

5-8=-3

生产者-消费者问题

有一个仓库(缓冲区),能放N件产品。生产者进程不断生产产品放入仓库,消费者进程不断从仓库取出产品。请用P、V操作描述他们的同步与互斥关系。

基础信号量

  1. mutex:互斥信号量,初值为1。(控制对仓库门的互斥访问)
  2. empty:空位数,初值为N。(代表仓库还能装多少)
  3. full:产品数,初值为0。(代表仓库里有多少货)

生产者进程

codeC

1
2
3
4
5
P(empty);   // 1. 检查有没有空位 (空位-1)
P(mutex); // 2. 锁住仓库门,我要放东西了
【放入产品】
V(mutex); // 3. 解锁仓库门
V(full); // 4. 通知消费者:有货了 (产品数+1)

消费者进程:

codeC

1
2
3
4
5
P(full);    // 1. 检查有没有货 (产品数-1)
P(mutex); // 2. 锁住仓库门,我要取东西了
【取出产品】
V(mutex); // 3. 解锁仓库门
V(empty); // 4. 通知生产者:有空位了 (空位+1)

死锁

死锁的四个必要条件

  1. 互斥条件
  2. 请求与保持条件(占有且等待)。
  3. 不可剥夺条件(不可抢占)。
  4. 循环等待条件

存储结构

  • 顺序存储(如数组)

  • 链式存储(如链表)

  • 索引存储

  • 散列存储(Hash)。

栈的输出

题目: 设有一个栈abc。请判断以下输出序列是否可能?

  • 除了cab都可能

二叉树遍历

image.png

将树转化为二叉树

核心口诀:长子做左孩,兄弟做右孩。
(意思是:节点的第一个孩子变成它的左孩子;节点的下一个亲兄弟变成它的右孩子。)

操作步骤(在草稿纸上画图):

  1. 加线(连兄弟): 在所有亲兄弟节点之间加一条连线。B-C, C-DE-F, F-GH-I
  2. 抹线(留长子): 对每个节点,只保留它与第一个孩子的连线,删掉它与其他孩子的连线。A只保留A-B,删掉A-C, A-D。B只保留B-E,删掉B-F, B-G。D只保留D-H,删掉D-I。
  3. 旋转(整理): 把这一坨连在一起的图稍微转一下,这就成了二叉树。

image.png

转换后的二叉树

写遍历序列

  1. 二叉树的先序序列 = 原树的先序序列
  • 从头往下,先向左再向右
  • ABEFGCDHI
  1. 二叉树的中序序列 = 原树的后序序列
  • 看原树写

  • 从左下↙向右上↗先写根,如果父亲有其他孩子,先写分支

  • EFGBCHIDA

  1. 二叉树的后序序列
  • GFEIHDCBA

面向对象

  • 对象:对象是面向对象编程的基本单元。

  • 封装: 封装是指将对象的实现细节(如内部数据)隐藏起来,只对外提供有限的访问接口。外部代码不能直接修改对象内部的状态,必须通过对象提供的方法来操作。

  • 继承:继承允许一个新类(子类)从现有的类(父类)中获得属性和方法。子类可以复用父类的代码,并在此基础上增加自己的新功能或修改旧功能。

  • 多态:多态字面意思是“多种形态”。它指的是同一个行为(接口/方法),在不同的对象上表现出不同的结果。即使我们不知道一个对象的具体类型,只要它属于某个父类,我们就可以调用父类定义的方法。

流程图与N-S图

流程图

image.png

N-S图

image.png

image.png

下一篇