gpt4 book ai didi

c - 在 c 位域中添加额外的位

转载 作者:太空宇宙 更新时间:2023-11-04 00:04:14 25 4
gpt4 key购买 nike

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

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;

问题是我必须为街道保留 10 位而不是 2 位。有什么方法可以添加吗?我必须确保地址是 32 位。

最佳答案

显而易见的解决方案是从其他部分获取一些位,例如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))

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

关于c - 在 c 位域中添加额外的位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30604244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com