我是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;发布于 2009-08-07 03:06:33
好的,简单的说:
之所以选择十六进制数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现在,在另一行之前添加注释将显示结果:
// 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;虽然赋值的注释清楚地说明了发生了什么,但一旦你理解了发生了什么,注释就有点违背了用符号定义常量的目的。
发布于 2009-08-07 02:31:01
这样想可能会有所帮助(值以二进制形式显示):
MSGINFO_ENABLE = 0001
MIME_ENABLE = 0010
FASTSTART_CODERS_IN_OFFERED = 0100
TRANSADDR_ENABLE = 1000所以..。
1001是TRANSADDR_ENABLE和MSGINFO_ENABLE
或
1101是除了FASTSTART_CODERS_IN_OFFERED之外的所有东西
这真的有帮助吗?|表示法是C语法,用于设置正确的位:
int something = 0;
something = MSGINFO_ENABLE | TRANSADDR_ENABLE; 是只设置这2位的语法。
发布于 2009-08-07 02:50:00
当您的变量msginfo_mask表示为二进制数(1和0)时,通过将某些位设置为1(使用逐位OR)或将某些位清除为0(使用逐位AND),可以将其用作“掩码”。您的代码片段将某些位设置为1,而保持其他位不变。蒙版相当于画家如何遮蔽他们不想被绘制的区域。
如果您查看代码顶部的#定义,您将注意到,当以二进制形式写出时,每个数字代表一个位:
#define MSGINFO_ENABLE 0x01 <-- 0001 in binary
#define MIME_ENABLE 0x02 <-- 0010 in binary
#define FASTSTART_CODERS_IN_OFFERED 0x04 <-- 0100 in binary
#define TRANSADDR_ENABLE 0x08 <-- 1000 in binary通过使用OR函数来设置位。如果与1进行位或运算,结果将始终为1。如果与0进行位或运算,则原始值不会改变。
所以,当你看到:
msginfo_mask = MSGINFO_ENABLE | MIME_ENABLE |
FASTSTART_CODERS_IN_OFFERED | TRANSADDR_ENABLE;你所说的是“将msginfo_mask的值与(二进制) 0001、0010、0100和1000进行OR运算。这等同于说”设置位0、位1、位2和位3“。
https://stackoverflow.com/questions/1242585
复制相似问题