c++ - pAddress & ~(PAGE_SIZE - 1) 获取页面基地址的技巧是什么

标签 c++ c bit-manipulation

以下函数用于获取页面内部地址的页面基址:

void* GetPageAddress(void* pAddress)
{
    return (void*)((ULONG_PTR)pAddress & ~(PAGE_SIZE - 1));
}

但我不太明白,它在这里玩的是什么把戏?

结论:
就个人而言,我认为 Amardeep 的解释加上 Alex B 的例子是最好的答案。由于 Alex B 的回答已经被投票通过,我想接受 Amardeep 的回答作为官方回答来强调它!谢谢大家。

最佳答案

该函数清除给定地址的低位,从而产生其页面的地址。

例如,如果 PAGE_SIZE 是 4096,那么在 32 位二进制中:

   PAGE_SIZE      = 00000000000000000001000000000000b
   PAGE_SIZE - 1  = 00000000000000000000111111111111b
 ~(PAGE_SIZE - 1) = 11111111111111111111000000000000b

如果您按位并使用 32 位地址,它会将低位变为零,将地址四舍五入为最接近的 4096 字节页面地址。

 ~(PAGE_SIZE - 1)             = 11111111111111111111000000000000b
                    pAddress  = 11010010100101110110110100100100b
 ~(PAGE_SIZE - 1) & pAddress  = 11010010100101110110000000000000b

因此,在十进制中,原始地址为 3533139236,页面地址(去除低位的地址)为 3533135872 = 862582 x 4096,是 的倍数4096

关于c++ - pAddress & ~(PAGE_SIZE - 1) 获取页面基地址的技巧是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3023909/

相关文章:

mysql - 使用 MySQL 中的位域列将一行分解为多行

java - 在lua中将字节数组转换为double

c++ - 从方法返回变量类型

c - 使用 C 在第 n 个位置插入节点的链表

c - 如何评估我的输入参数是否将所有偶数位都设置为 1?

编译器提示 '/226 error in C' 引用代码中的减号

c - 并行运行代码的潜在危险

c++ - GNU gcc 和 g++

c++ - 是否可以在 GPU 中运行一段纯 C++ 代码

c++ - 为什么我的排序方法不起作用?