我是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)
虽然对作业的评论清楚地表明发生了什么,但一旦你理解了正在发生的事情,这些评论就会失去象征性地定义常数的目的.
以这种方式思考它可能有所帮助(以二进制显示的值):
MSGINFO_ENABLE = 0001
MIME_ENABLE = 0010
FASTSTART_CODERS_IN_OFFERED = 0100
TRANSADDR_ENABLE = 1000
Run Code Online (Sandbox Code Playgroud)
所以...
1001是TRANSADDR_ENABLE和MSGINFO_ENABLE
或
1101是eveything但是FASTSTART_CODERS_IN_OFFERED
这些帮助有用?该|符号是C语法来设置正确的位:
int something = 0;
something = MSGINFO_ENABLE | TRANSADDR_ENABLE;
Run Code Online (Sandbox Code Playgroud)
是仅设置那2位的语法.