首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >掩码的工作原理

掩码的工作原理
EN

Stack Overflow用户
提问于 2009-08-07 02:24:01
回答 6查看 4.2K关注 0票数 11

我是C语言的新手,我正在用源代码进行调试。然而,我对这个代码片段感到困惑。

当这些值被赋值给结构值时,我认为它是一些掩码。但不确定,以及它是否是掩饰。在这个概念中,掩蔽是如何工作的?

非常感谢,

代码语言:javascript
复制
#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;
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-08-07 03:06:33

好的,简单的说:

之所以选择十六进制数0x01,0x02,0x04,0x08,是因为它们都被编码为以二进制形式设置的不同单比特。没有一个位图重叠,因此每个位图都可以读取和设置,而不会受到其他位的影响。将以下注释添加到您的代码中,可以更清楚地了解发生了什么:

代码语言:javascript
复制
#define MSGINFO_ENABLE                   0x01  // => 0001
#define MIME_ENABLE                      0x02  // => 0010
#define FASTSTART_CODERS_IN_OFFERED      0x04  // => 0100
#define TRANSADDR_ENABLE                 0x08  // => 1000

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

代码语言:javascript
复制
// 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;

虽然赋值的注释清楚地说明了发生了什么,但一旦你理解了发生了什么,注释就有点违背了用符号定义常量的目的。

票数 16
EN

Stack Overflow用户

发布于 2009-08-07 02:31:01

这样想可能会有所帮助(值以二进制形式显示):

代码语言:javascript
复制
MSGINFO_ENABLE = 0001
MIME_ENABLE = 0010
FASTSTART_CODERS_IN_OFFERED = 0100
TRANSADDR_ENABLE = 1000

所以..。

1001是TRANSADDR_ENABLEMSGINFO_ENABLE

1101是除了FASTSTART_CODERS_IN_OFFERED之外的所有东西

这真的有帮助吗?|表示法是C语法,用于设置正确的位:

代码语言:javascript
复制
int something = 0;
something = MSGINFO_ENABLE | TRANSADDR_ENABLE; 

是只设置这2位的语法。

票数 7
EN

Stack Overflow用户

发布于 2009-08-07 02:50:00

当您的变量msginfo_mask表示为二进制数(1和0)时,通过将某些位设置为1(使用逐位OR)或将某些位清除为0(使用逐位AND),可以将其用作“掩码”。您的代码片段将某些位设置为1,而保持其他位不变。蒙版相当于画家如何遮蔽他们不想被绘制的区域。

如果您查看代码顶部的#定义,您将注意到,当以二进制形式写出时,每个数字代表一个位:

代码语言:javascript
复制
#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进行位或运算,则原始值不会改变。

所以,当你看到:

代码语言:javascript
复制
msginfo_mask = MSGINFO_ENABLE | MIME_ENABLE | 
               FASTSTART_CODERS_IN_OFFERED | TRANSADDR_ENABLE;

你所说的是“将msginfo_mask的值与(二进制) 0001、0010、0100和1000进行OR运算。这等同于说”设置位0、位1、位2和位3“。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1242585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档