首页 > 解决方案 > 如何从 64 中获得 63 位

问题描述

我有一些由硬件填充的 32 位内存区域,其中包含此类数据:

reg1 :    63  |  62  |  ... | 32     |  reg0 :   31| ... | 0
        --------------------------   |          ----------------
         val  | time value upper     |          time value lower

我正在尝试使用structunion一次获取时间值和“val” 。

我第一次尝试:

typedef struct
{
    uint64_t time   : 63;
    uint64_t value  :  1;
} myStruct;

但这不起作用,myStruct.time不能大于 32 位。

我尝试了几件事,事件是这样的:

typedef union
{
    union{
        struct{
            uint32_t lower : 32;
            uint32_t upper : 31;
        } spare;
        uint64_t value;
    } time;
    struct{
        uint32_t spare_low : 32;
        uint32_t spare_upp : 31;
        uint32_t value : 1;
    } pin;
} myStruct;

但在这种情况下,myStruct.time.value显然得到第 63 位。我得到一些值,例如 0x8000_0415_4142_3015 而不是 0x0000_0415_4142_3015。

如何轻松检索 63 位时间值和 1 位引脚值?

PS:我知道我可以制作这样的宏,我正在寻找一种直接的方法。

标签: cstructunion

解决方案


当位放置很重要时,绝不应使用位域。

改用位掩码:

uint64_t someValue = ...
uint64_t time = someValue & 0x7fffffffffffffff;
bool pin = someValue >> 63 & 1; 

推荐阅读