【问题标题】:Extracting bits from a 64 bit hex address into an unsigned int in C从 64 位十六进制地址中提取位到 C 中的无符号整数中
【发布时间】:2013-12-15 07:26:40
【问题描述】:

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

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

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

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

【问题讨论】:

  • “前 2 位”中的短语“第一个”可以解释:您是指前 2 个最低有效位还是前两个最高有效位?最好使用“最不重要”或“最重要”而不是“第一”。 2 个答案反映了这种困惑。

标签: c caching bit-manipulation


【解决方案1】:

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

例如

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

【讨论】:

    【解决方案2】:
    typedef struct parse64 {
        unsigned int get:2,
        unsigned int set:2,
        unsigned int tag:60 // if your system is a64 bit system
    } parse64;
    

    在您的代码中:

    struct parse64 *parser;
    parser = (struct parse64 *) data;
    
    unsigned int get = parser->get;
    

    根据您的编辑

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

    您也可以通过按位运算获取数据:

    get = data & 0x03 //in binary 0X03 is equivalent to 00....000011
    set = (data & 0x12)>>2 //in binary 0X12 is equivalent to 00....001100
    

    【讨论】:

    • 这可能是位域的正确布局;不保证是正确的布局。实际上,标准对位域的保证很少。
    • @JonathanLeffler 你能否澄清更多或为此提供链接(SO主题)
    • 这将是一个很好的解决方案,但是我需要将它推广到任何数量的专用于标记、设置索引等的位
    • @Tom 你使用按位运算。详情见我的回答
    猜你喜欢
    • 2015-11-10
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 2010-11-23
    • 2023-03-11
    相关资源
    最近更新 更多