重置c位域中的所有位

时间:2014-11-25 07:59:36

标签: c bit-fields

我认为使用C位域而不是int以及一堆#define s可以提供更好的读取代码,并减少在添加新字段时调整现有代码的需要。有没有可能使用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之外),但需要使用代码重置其他标志字段。

2 个答案:

答案 0 :(得分:2)

我只是建议:

memset(&my_flags, 0, sizeof(myflags));

这样,你仍然可以在你的结构中添加字段,由于sizeof,它们将被重置。

答案 1 :(得分:2)

我想将评论扩展到答案:

使用联合,您可以拥有一个数字变量,并且您的位字段共享相同的内存:

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.联合将始终占用其中最大对象所需的内存量。因此,如果您需要比INT更多的位,您也可以使用longlong long

我还没有见过计算机编程中的工会"到目前为止,但对于微控制器,它们经常被使用。