c - 将 64 位十六进制地址中的位提取到 C 中的无符号整数中

标签 c caching bit-manipulation

我目前正在开发一个用 C 语言模拟缓存的程序。我一直在研究,我知道如何设置和测试各个位,但我如何从 64 位十六进制的中间提取 x 位地址?

例如,我有一个 64 位的十六进制地址。前 2 位专用于 block 偏移量,接下来的 2 位专用于集合索引,最后 60 位用于标记。如何将前 2 位提取为无符号整数?我怎样才能提取接下来的 2 位?

编辑:这只是一个例子。我希望有一个解决方案可以让您在地址中的任何位置获得任意数量的位

第二次编辑:当我说前 2 位时,我指的是最低有效位。抱歉。

最佳答案

转换为 uintptr_t 来自 <stdint.h>并使用 >>&提取位。

例如

uintptr_t ptr_int = (uintptr_t) ptr;
unsigned int bits1 = (unsigned int)((ptr_int >> 62) & 0x3)  // First two most significant bits
unsigned int bits2 = (unsigned int)((ptr_int >> 60) & 0x3)  // Next two most significant bits

关于c - 将 64 位十六进制地址中的位提取到 C 中的无符号整数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20592252/

相关文章:

c - 获取最高有效半字节,无论 int 位长度和字节顺序如何

python - 在 Python 中解析 128 字节十六进制 block 中的位

c - 找到下一个除以 8 的数字?

c++ - 只有 wWinMain MSVC 2019 的链接器错误无法解析的外部符号

c - 不同源文件中的重复结构定义

c - ANSI C - 直接声明符语法 - 为什么 C 语法允许语法上合法但语义上非法的声明,如 int func()()?

caching - Redis 缓存 - "Server Closed the connection"错误

java - 注销后单击后退按钮缓存问题

compression - 为什么这个C程序填充驱动器C :\?

javascript - 如何从可以从脚本包含标记引用的 PHP 文件输出 javascript 文件