前导知识
一个整数 a * 2 相当于 对 a 的 二进制 左移一位
一个整数 a / 2 相当于 对 a 的 二进制 右移一为

a = 5:
//二进制代码为 0101
a = 10;
//二进制代码为 1010 (左移末位补0)

类似的,
a * 2^k 相当于 对 a 的 二进制 左移k位
a / 2^k 相当于 对 a 的二进制 右移k位
(无符号左移右移,想学习的话,在计算机组成原理 第二章)

接下来我们以分页存储为例,讲一下地址变换过程

由逻辑地址到物理地址的转换需要以下几步
——————————————————————————————

第一步:计算页号和页内偏移量

页号 = 逻辑地址 / 页框大小    (整数部分)
页内偏移量 = 逻辑地址 % 页框大小 

第二步:查页表,找出页号对应的物理块号

由于操作系统为每个进程分配一个页表,进程又细分为多个页面
每个页面对应页表中的一个页表项(页表的一行)

所以根据第一步得到的  页号       
得到页号所对应页表项的物理地址:页表的起始地址+页号*页表项的长度
注: 页表的起始地址存放在PCB里
注:页表项的长度={
   主存容量/物理块的大小} 这一部分对应的二进制长度

第三步,拼接 VS 相乘

第一个方法:

根据第二步得到的块号,不妨记为 b 
 b*物理块大小 就为该逻辑地址的物理地址
 
 注:因为在划分内存的时候物理块就是从 0 开始编号的
 b号物理块,前面有 b 个物理块(从0开始编号)
 所以 b*物理块大小 就为该逻辑地址的物理地址
第二个方法:

	先算出 页表中 块号 要占几位 ,就用几位来表示 我们在第二步中算出的块号
	之后 算出 页内偏移量占几位 ,就用几位来表示 偏移量
	最后,将页号放在前面,偏移量放在后面拼接就可以了

举个例子:

直接两者一拼就ok了。

既然两者都能得到正确的结果那么怎么相互转换呢?

我们通过第一种方法:

 根据第二步得到的块号,不妨记为 b 
 b*物理块大小 就为该逻辑地址的物理地址

我们乘了物理块的大小,而物理块的大小 正好是 2^k ,相当于向左移了k位,
比如:物理块的大小为 2^12 , 那么页内地址就要占 12位
得到的物理块号假设为 3(0011) , 那么 3 * 2^12 次方相当于左移了12位
就变成了

0011000000000000

在加上偏移量假如为10,那么偏移量占几位呢 , 正好是 12位,所以就把偏移量放到 上方的 12个0处就好
变成了

0011000000001010

以上就是 两种方法的转换过程