掩蔽是如何工作的

ant*_*009 11 c c++

我是C的新手,我正在调试源代码.但是,我对此代码段感到困惑.

当值被分配给结构值时,我认为它是一些掩盖.但不确定,如果它是掩盖的.屏蔽如何在这个概念中发挥作用?

非常感谢,

#define MSGINFO_ENABLE                   0x01
#define MIME_ENABLE                      0x02
#define FASTSTART_CODERS_IN_OFFERED      0x04
#define TRANSADDR_ENABLE                 0x08

typedef struct {

    unsigned int    msginfo_mask;     /* added in version 0x0101               */

} VIRTBOARD; 


VIRTBOARD       VirtBoard;

/* Not sure I understand what is happening here. */
VirtBoard.msginfo_mask  = MSGINFO_ENABLE | MIME_ENABLE | FASTSTART_CODERS_IN_OFFERED | TRANSADDR_ENABLE;
Run Code Online (Sandbox Code Playgroud)

NoM*_*ots 16

用简单的英语说:

每个十六进制数0x01,0x02,0x04,0x08都被选中,因为它们每个都被编码为以二进制设置的不同单个位.没有位图重叠,因此每个位图都可以被读取和设置而不受其他位的影响.在代码中添加以下注释可以更清楚地了解发生的情况:

#define MSGINFO_ENABLE                   0x01  // => 0001
#define MIME_ENABLE                      0x02  // => 0010
#define FASTSTART_CODERS_IN_OFFERED      0x04  // => 0100
#define TRANSADDR_ENABLE                 0x08  // => 1000
Run Code Online (Sandbox Code Playgroud)

现在在另一行之前添加注释会显示结果:

// VirtBoard.msginfo_mask |= 0001 
// VirtBoard.msginfo_mask |= 0010 
// VirtBoard.msginfo_mask |= 0100 
// VirtBoard.msginfo_mask |= 1000
//                           ----
// VirtBoard.msginfo_mask == 1111
VirtBoard.msginfo_mask = MSGINFO_ENABLE              |
                         MIME_ENABLE                 |
                         FASTSTART_CODERS_IN_OFFERED |
                         TRANSADDR_ENABLE;
Run Code Online (Sandbox Code Playgroud)

虽然对作业的评论清楚地表明发生了什么,但一旦你理解了正在发生的事情,这些评论就会失去象征性地定义常数的目的.

  • 你永远不会需要40亿个全局变量,每个全局变量都是一个可以打开或关闭的bool,你最多需要32个全局变量. (2认同)

mar*_*rcc 7

以这种方式思考它可能有所帮助(以二进制显示的值):

MSGINFO_ENABLE = 0001
MIME_ENABLE = 0010
FASTSTART_CODERS_IN_OFFERED = 0100
TRANSADDR_ENABLE = 1000
Run Code Online (Sandbox Code Playgroud)

所以...

1001是TRANSADDR_ENABLEMSGINFO_ENABLE

1101是eveything但是FASTSTART_CODERS_IN_OFFERED

这些帮助有用?该|符号是C语法来设置正确的位:

int something = 0;
something = MSGINFO_ENABLE | TRANSADDR_ENABLE; 
Run Code Online (Sandbox Code Playgroud)

是仅设置那2位的语法.