我必须更新以下结构才能在结构中添加街道信息。
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位。
答案 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))
这可以保证最佳的内存使用率(不会浪费任何比特组合)。主要的权衡是在性能和代码清晰度方面更难以访问各个字段。理想情况下,枚举将自动生成。