C语言如何使用Bitwise提取页码和偏移量

How to use Bitwise to extract Page Number and Offset in Language C

我正在研究 C 语言的按位运算符,现在我正在开发一个带有 FIFO 替换算法的分页模拟器以适应操作系统规则,并且遇到了 使用按位 的困难。


SIZE PAGE 1024                    // 1024 bits == 128 BYTES
PHYSICAL MEMORY SIZE 10           // 10 bits (PHYSICAL)
VIRTUAL MEMORY SIZE 16            // 16 bits (VIRTUAL)
NUMBER PHYSICAL PAGES 8           // 8 FRAMES
NUMBER OF VIRTUAL PAGES 512

所以如果我们有 16 位虚拟内存,我们就有从 0 到 65535 ((2^16) -1) 的逻辑地址。这样,我们将有 9b 用于地址,7b 用于数据

示例编号 546 (0000 0010 0010 0010):

 Page Number  |  Offset
 0000 0010 0  |  010 0010
&1111 1111 1  |  000 0000
 0000 0010 0  |  000 0000
so, using right shift >> I get the value of the address.

重要的是要考虑页码,偏移量是没有用的。我试图处理文本操作,但它确实导致了问题,因为没有考虑前导零,这与 int 和按位一起使用是正确的。我找到了一个如何执行提取的示例,但即使进行了必要的更改,它仍然出错,这里是 link:Click Here.

void extract_fields(unsigned int address){ ... }

如果有人能帮助我,因为我不确定如何应用给定地址的位掩码,非常感谢,我相信它会帮助很多人,因为疑问是经常出现的,并且学术目的。

解决您的问题唯一重要的是如何从给定的虚拟地址中提取虚拟页码。

这可以通过简单的向右移动七位(七是 128 字节页内寻址所需的位数)或除以 128 的整数除以余数来完成:

unsigned int extract_page(unsigned int address) {
    return address >> 7;
}

使用scanf("%u", &address)从输入文件中读取每个地址。​​