tags:

views:

109

answers:

3
enum AccessSource
        {
            AccessSourceNull = 0x00000001,
            AccessSourceSec = 0x00000002,
            AccessSourceIpo = 0x00000004,
            AccessSourceSSA = 0x00000008,
            AccessSourceUpgrade = 0x00000010,
            AccessSourceDelta = 0x00000020,
            AccessSourcePhoneM = 0x00000040,
            AccessSourceSoft = 0x00000080,
            AccessSourceCR = 0x00000100,
            AccessSourceA = 0x00000200,
            AccessSourceE = 0x00000400,
            AccessSourceAll = 0xFFFFFFFF
        };

What is the value of AccessSourceAll ?? is it -1? or is it maximum value? I have a parameter ULONG x , whose default value is AccessSourceAll(that means access to all). How do i remove the access right of AccessSourceE only? How to add the access right of AccessSourceE again?

If i have a particular value in x, then how do i know whether AccessSourceE is set or not?

+8  A: 

The value of AccessSourceAll is (int)0xFFFFFFFF since enum is of type int in C.

The unset just AccessSourceE use:

x & ~AccessSourceE  // to assign: x &= ~AccessSourceE;

To add, use

x | AccessSourceE  // to assign: x |= AccessSourceE;

To test,

if (x & AccessSourceE) { ... }
Alex
Thanks Alex....
Sunil
+3  A: 

I'm not sure it'll actually matter since it is a mask which will clearly have a bit set for each of the other values.

If you are assigning it to a ULONG, it will be an unsigned type. To set/remove values use bitwise logic:

x |= AccessSourceE; /* set SourceE */
x &= ~AccessSourceE; /* unset SourceE */
if(x & AccessSourceE) /* test SourceE */
Evan Teran
Thanks Evan Teran....
Sunil
A: 

You can use the ^ operator for this. For Example :

unsigned long l_unValue = AccessSource::AccessSourceAll;

l_unValue = l_unValue ^ AccessSource::AccessSourceE;

The above statement will remove "AccessSourceE" from "AccessSourceAll".

Rajasekhar
That will toggle the bit, not necessarily remove it.
Alex