Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How masking works

Tags:

c++

c

I am new at C, and I am debugging with source code. However, I am confused with this code snippet.

When the values are assigned to the structure value, I think it is some masking. But not sure, and if it is masking. How does masking work in this concept?

Many thanks,

#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;
like image 852
ant2009 Avatar asked Aug 07 '09 02:08

ant2009


People also ask

Why do we need masking?

Layered prevention strategies — like staying up to date on vaccines and wearing masks — can help prevent severe illness and reduce the potential for strain on the healthcare system. Wear a mask with the best fit, protection, and comfort for you.

What is the purpose of a mask art?

Many masks are primarily associated with ceremonies that have religious and social significance or are concerned with funerary customs, fertility rites, or the curing of sickness. Other masks are used on festive occasions or to portray characters in a dramatic performance and in reenactments of mythological events.

How do clay masks work?

Clay helps absorb oils and control shine. Clay is popular for these skin types for good reason. “It helps draw out the impurities as well as absorb excess oils that are on the surface of the skin,” explains Konish. “Additionally, it helps reduce excess shine.” You can kiss your clogged pores goodbye.


3 Answers

Ok in plain English:

The Hexdecimal numbers 0x01,0x02,0x04,0x08 were each selected BECAUSE they are each encoded as different single bits being set in binary. None of the bit maps overlap so each one can be read and set without being effected by the other bits. Adding the following comments to your code makes it clearer what's happening:

#define MSGINFO_ENABLE                   0x01  // => 0001
#define MIME_ENABLE                      0x02  // => 0010
#define FASTSTART_CODERS_IN_OFFERED      0x04  // => 0100
#define TRANSADDR_ENABLE                 0x08  // => 1000

Now adding a comment before the other line shows the result:

// 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;

While the comments on the assignment make it clear what's going on, once you understand what's happening, the comments kinda defeat the purpose of symbolically defining constants.

like image 107
NoMoreZealots Avatar answered Nov 04 '22 03:11

NoMoreZealots


It might help to think of it this way (values shown in binary):

MSGINFO_ENABLE = 0001
MIME_ENABLE = 0010
FASTSTART_CODERS_IN_OFFERED = 0100
TRANSADDR_ENABLE = 1000

So...

1001 is TRANSADDR_ENABLE and MSGINFO_ENABLE
or
1101 is eveything but FASTSTART_CODERS_IN_OFFERED

Does that help at all? The | notation is C syntax to set the correct bit:

int something = 0;
something = MSGINFO_ENABLE | TRANSADDR_ENABLE; 

is the a syntax to set only those 2 bits.

like image 29
marcc Avatar answered Nov 04 '22 02:11

marcc


Your variable, msginfo_mask, when represented as a binary number (1's and 0's) is used as a "mask" by setting certain bits to 1 (using bit-wise OR) or clearing certain bits to 0 (using bit-wise AND). Your code snippet sets certain bits to 1 while leaving others unchanged. Masking is comparable to how a painter masks off areas that they do not want to be painted.

If you look at the #defines at the top of your code, you will notice that each number represents a single bit when written out in binary:

#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

Setting bits is done by using the OR function. If you OR a bit with 1, the result is always going to be a 1. If you OR a bit with 0, the original value will not be changed.

So, when you see:

msginfo_mask = MSGINFO_ENABLE | MIME_ENABLE | 
               FASTSTART_CODERS_IN_OFFERED | TRANSADDR_ENABLE;

What you are saying is "take the value of msginfo_mask and OR it with (binary) 0001, 0010, 0100, and 1000. This is the same thing as saying "set bit 0, bit 1, bit 2, and bit 3."

like image 44
Robert Cartaino Avatar answered Nov 04 '22 01:11

Robert Cartaino