如何使用按位提取语言C中的页码和偏移量

时间:2018-06-19 17:15:59

标签: c bit-manipulation paging bitwise-operators fifo

我正在研究语言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.

重要的是要考虑页码,偏移量将毫无用处。我试图处理文本,但是确实引起了问题,因为没有考虑以零和位为单位的前导零。我找到了一个有关如何执行提取的示例,但是即使进行了必要的更改,它仍然出错,这里是链接:Click Here.

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

如果有人可以帮助我,因为我不确定如何在给定地址的情况下使用位掩码,非常感谢,我相信这会对很多人有帮助,因为这种疑问经常出现并且出于学术目的。

1 个答案:

答案 0 :(得分:2)

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

这可以通过向右简单移位7个位置(在128字节页面内需要寻址的位数为7)或通过整数除以128来完成,这会减少其余部分:

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

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