gpt4 book ai didi

c - 重置 c 位字段中的所有位

转载 作者:行者123 更新时间:2023-12-02 06:12:11 26 4
gpt4 key购买 nike

我认为使用 C 位域而不是 int 以及一堆 #define 会提供更好阅读的代码并减少对添加新字段时调整现有代码。是否有可能使用 int-#define-方法提供的单个命令将 C 位字段中的所有位重置为零?

示例:

#define MYFLAG_1 0x01
#define MYFLAG_2 0x02
#define MYFLAG_3 0x04

int myflags = MYFLAG_1 | MYFLAG_3;

/* Reset: */
myflags = 0;

对比

struct {
int flag_1 : 1;
int flag_2 : 1;
int flag_3 : 1;
} myflags;

myflags.flag_1 = 1;
myflags.flag_3 = 1;

/* Reset: */
myflags.flag_1 = 0;
myflags.flag_2 = 0;
myflags.flag_3 = 0;

向该字段添加附加标志不需要对第一个示例的现有代码进行任何更改(#define 除外),但需要代码来重置附加标志字段。

最佳答案

我想将我的评论扩展到答案:

使用 union ,您可以让数值变量和位字段共享相同的内存:

typedef  union{
struct {
int flag_1 : 1;
int flag_2 : 1;
int flag_3 : 1;
};
unsigned int value;
} MyBitField;

// ...
MyBitField myflags;

myflags.flag_1 = 1;
myflags.flag_3 = 1;

/* Reset: */
//myflags.flag_1 = 0;
//myflags.flag_2 = 0;
//myflags.flag_3 = 0;

myflags.value = 0;

现在,您可以轻松地将所有位设置为 0。 union 体将始终占用其中最大对象所需的内存量。因此,如果您需要比 INT 更多的位,您也可以使用 longlong long

到目前为止,我还没有在“计算机编程”中见过 union 体,但对于微 Controller 来说,它们的使用相当频繁。

关于c - 重置 c 位字段中的所有位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27121427/

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