正如许多消息来源说的那样,使用((1 << x) -1) << y将x位从y分离到y + x,并且构建了这样一个线性地址:0:11是偏移量,12:21是页面,22:31是目录。但是,当我使用上面的位掩码并试图提取目录时,它似乎根本不起作用。
/* unsigned address */
#define MASK_DIR ((1u << 9) - 1) << 22
int main(void)
{
unsigned int dir;
uint32_t addr = 0x12345678;
dir = MASK_DIR & addr;
printf("%#x", dir); // 0x12000000
}当使用与上面相同的过程的(1u << 11) - 1时,提取偏移量效果很好。
发布于 2022-06-15 12:01:24
As @Gerhardh纠正了我的错误计算,我认为0-11是11位,尽管它是12位。
#define ADDR_PAGE(addr) ((((1u << 10) - 1) << 12) & addr)
#define ADDR_DIR(addr) ((((1u << 10) - 1) << 22) & addr)
#define ADDR_OFF(addr) (((1u << 12) - 1) & addr)输出0x678 - 0x345000 - 0x12000000 (offset, page, dir)
https://stackoverflow.com/questions/72629154
复制相似问题