计算机导论
数制转换
各种进制数的表示方法
二进制后缀是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(十进制),请写出它的国标码和机内码(用十六进制表示)。
区位码分别转十六进制:
拆分区位码(6位16进制数):(区码(4位)+位码(2位))
区码=32
位码=40
32→20H
40→28H
即2028H
求国标码:
国标码 = 区位码(十六进制) + 2020H(区码、位码分别加 20H)。
2028H+2020H=4048H
求机内码:
机内码 = 国标码 + 8080H(区码、位码分别加 80H)
4048H+8080H=C0C8H
地址重定位
题目: 在页式存储管理中,页面大小为 1KB。某进程的逻辑地址为 2500。查页表得知,该逻辑页对应的物理块号(页框号)为 5。请计算物理地址。
核心公式: 物理地址=物理块号*页面大小+页内偏移量
页内偏移量=逻辑地址%页面大小
页面大小:1 KB=1024 B
逻辑地址:2500
物理块号:5
页内偏移量=2500 % 1024=2500−2×1024=2500−2048=452
物理地址=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) 写出它的主机号。
- 类别: 首字节192,属于 C类(192-223)。
- 子网掩码: C类默认掩码是 255.255.255.0。
- **主机号:**主机号的计算规则是: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
冯诺依曼体系结构基本思想
数据以二进制表示。
存储器是按地址访问的线性编址的一维结构,每个单元的位数是固定的。
采用存储程序方式,指令和数据不加区别混合存储在同一个存储器中。
指令由操作码和操作数地址组成。
通过执行指令直接发出控制信号控制计算机。
以运算器为中心,I/O设备与存储器间的数据传送都要经过运算器。
指令的执行过程
寄存器中文名
- PC (Program Counter):程序计数器
- 作用:存放下一条要执行的指令的地址(自动 + 1)。
- IR (Instruction Register):指令寄存器
- 作用:存放当前正在执行的指令。
- MAR / AR (Memory Address Register):地址寄存器
- 注意:图 1 叫 MAR,图 2 叫 AR,它俩是一个东西。
- 作用:存放要访问的存储单元的地址。
- MDR / DR (Memory Data Register):数据寄存器
- 注意:图 1 叫 MDR,图 2 叫 DR,也是一个东西。
- 作用:存放从内存读出或写入内存的数据 / 指令。
- ALU (Arithmetic Logic Unit):算术逻辑单元
- 作用:负责加减乘除和逻辑运算。
- ACC / GPRs:累加器 / 通用寄存器组
- 作用:存放运算的操作数或结果。
- 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 和其他部件发出控制信号。
- 如果有操作数在内存,再次通过 MAR 和 MDR 取出数据。
- ALU 完成运算,将结果写回 寄存器 (ACC/GPRs) 或 存储器。
简化流程:
PC →→ MAR →→ 内存 →→ MDR →→ IR
总线
按位置分类
片内总线,片总线,内总线,外总线
按传输信息分类
地址总线,数据总线,控制总线
微机采用的三级存储方式
高速缓存,主存,外存
中断
题目: CPU在执行程序时,被外部突发事件打断,转而去处理该事件,处理完后又回到原程序断点处继续执行。(概念)请写出中断处理过程的六个步骤。
中断请求→中断判优→中断响应→中断处理→中断返回
作用: 提高效率、提高响应速度、提高健壮性
进程
三种基本状态
- 就绪态:获得除处理器外的所有资源
- 运行态:占用处理器资源
- 阻塞态:等待某种条件
临界资源与临界区
- 临界资源: 一次仅允许一个进程使用的共享资源(如打印机)。
- 临界区: 进程中访问临界资源的那段代码(注意:临界区是代码,不是区域)。
进程的互斥与同步(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操作描述他们的同步与互斥关系。
基础信号量
- mutex:互斥信号量,初值为1。(控制对仓库门的互斥访问)
- empty:空位数,初值为N。(代表仓库还能装多少)
- full:产品数,初值为0。(代表仓库里有多少货)
生产者进程
codeC
1 | P(empty); // 1. 检查有没有空位 (空位-1) |
消费者进程:
codeC
1 | P(full); // 1. 检查有没有货 (产品数-1) |
死锁
死锁的四个必要条件
- 互斥条件。
- 请求与保持条件(占有且等待)。
- 不可剥夺条件(不可抢占)。
- 循环等待条件。
存储结构
顺序存储(如数组)
链式存储(如链表)
索引存储
散列存储(Hash)。
栈的输出
题目: 设有一个栈abc。请判断以下输出序列是否可能?
- 除了cab都可能
二叉树遍历
将树转化为二叉树
核心口诀:长子做左孩,兄弟做右孩。
(意思是:节点的第一个孩子变成它的左孩子;节点的下一个亲兄弟变成它的右孩子。)
操作步骤(在草稿纸上画图):
- 加线(连兄弟): 在所有亲兄弟节点之间加一条连线。B-C, C-DE-F, F-GH-I
- 抹线(留长子): 对每个节点,只保留它与第一个孩子的连线,删掉它与其他孩子的连线。A只保留A-B,删掉A-C, A-D。B只保留B-E,删掉B-F, B-G。D只保留D-H,删掉D-I。
- 旋转(整理): 把这一坨连在一起的图稍微转一下,这就成了二叉树。
转换后的二叉树
写遍历序列
- 二叉树的先序序列 = 原树的先序序列
- 从头往下,先向左再向右
- ABEFGCDHI
- 二叉树的中序序列 = 原树的后序序列
看原树写
从左下↙向右上↗先写根,如果父亲有其他孩子,先写分支
EFGBCHIDA
- 二叉树的后序序列
- GFEIHDCBA
面向对象
对象:对象是面向对象编程的基本单元。
封装: 封装是指将对象的实现细节(如内部数据)隐藏起来,只对外提供有限的访问接口。外部代码不能直接修改对象内部的状态,必须通过对象提供的方法来操作。
继承:继承允许一个新类(子类)从现有的类(父类)中获得属性和方法。子类可以复用父类的代码,并在此基础上增加自己的新功能或修改旧功能。
多态:多态字面意思是“多种形态”。它指的是同一个行为(接口/方法),在不同的对象上表现出不同的结果。即使我们不知道一个对象的具体类型,只要它属于某个父类,我们就可以调用父类定义的方法。