在c位域中添加额外的位

时间:2015-06-02 18:51:28

标签: c

我必须更新以下结构才能在结构中添加街道信息。

typedef struct address_tag {
    union {
        struct {
            unsigned state   : 20;     
            unsigned city    : 10; 
            unsigned unused :2;
        };

        uint32_t address;
    };

} defect_address_t;

我使用了未使用的位并在街道上使用了2位:

typedef struct address_tag {
    union {
        struct {
            unsigned state   : 20;     
            unsigned city    : 10; 
            unsigned street :2;
        };

        uint32_t address;
    };

}address_t;

问题是我必须为街道而不是2预留10位。有没有办法可以添加呢?我必须确保地址是32位。

1 个答案:

答案 0 :(得分:0)

显而易见的解决方案是从其他位置获取一些位,例如state。如果您只是美国,则状态不需要超过6位。无论如何,你可能需要来自城市领域的一些位。

但是,如果您唯一关心的是内存(占用不超过32位),您可以将所有可能性添加到enum,并具有提取州/城市/街道的功能。

typedef enum state_city_street_t
{
    CALIFORNIA,
    CALIFORNIA_SANFRANCISCO = CALIFORNIA,
    CALIFORNIA_SANFRANCISCO_MISSIONSTREET = CALIFORNIA_SANFRANCISCO,
    CALIFORNIA_SANFRANCISCO_HOWARDSTREET,
    CALIFORNIA_SANFRANCISCO_END,
    CALIFORNIA_MOUNTAINVIEW = CALIFORNIA_SANFRANCISCO_END,
    CALIFORNIA_MOUNTAINVIEW_CASTROSTREET = CALIFORNIA_MOUNTAINVIEW,
    ...
    CALIFORNIA_END,
    NEVADA = CALIFORNIA_END,
    NEVADA_LASVEGAS = NEVADA,
    NEVADA_LASVEGAS_THESTRIP = NEVADA_LASVEGAS,
    ...
} state_city_street_t;

#define GET_CONST(state, city, street) state##_##city##_##street
#define IS_STATE(value, state) ((value >= state) && (value < state##_END))

这可以保证最佳的内存使用率(不会浪费任何比特组合)。主要的权衡是在性能和​​代码清晰度方面更难以访问各个字段。理想情况下,枚举将自动生成。