Marko
Marko

Reputation: 13233

VB.NET enum declaration syntax

I recently saw a declaration of enum that looks like this:

<Serializable()>
<Flags()>
Public Enum SiteRoles

    ADMIN = 10 << 0
    REGULAR = 5 << 1
    GUEST = 1 << 2

End Enum

I was wondering if someone can explain what does "<<" syntax do or what it is used for? Thank you...

Upvotes: 1

Views: 1314

Answers (2)

Bitwise
Bitwise

Reputation: 31

The ENUM has a Flags attribute which means that the values are used as bit flags.

Bit Flags are useful when representing more than one attribute in a variable

These are the flags for a 16 bit (attribute) variable (hope you see the pattern which can continue on to X number of bits., limited by the platform/variable type of course)

BIT1 = 0x1 (1 << 0)
BIT2 = 0x2 (1 << 1)
BIT3 = 0x4 (1 << 2)
BIT4 = 0x8 (1 << 3)
BIT5 = 0x10 (1 << 4)
BIT6 = 0x20 (1 << 5)
BIT7 = 0x40 (1 << 6)
BIT8 = 0x80 (1 << 7)
BIT9 = 0x100 (1 << 8)
BIT10 = 0x200 (1 << 9)
BIT11 = 0x400 (1 << 10)
BIT12 = 0x800 (1 << 11)
BIT13 = 0x1000 (1 << 12)
BIT14 = 0x2000 (1 << 13)
BIT15 = 0x4000 (1 << 14)
BIT16 = 0x8000 (1 << 15)

To set a bit (attribute) you simply use the bitwise or operator:

UInt16 flags;
flags |= BIT1; // set bit (Attribute) 1
flags |= BIT13; // set bit (Attribute) 13

To determine of a bit (attribute) is set you simply use the bitwise and operator:

bool bit1 = (flags & BIT1) > 0; // true;
bool bit13 = (flags & BIT13) > 0; // true;
bool bit16 = (flags & BIT16) > 0; // false;

In your example above, ADMIN and REGULAR are bit number 5 ((10 << 0) and (5 << 1) are the same), and GUEST is bit number 3.

Therefore you could determine the SiteRole by using the bitwise AND operator, as shown above:

UInt32 SiteRole = ...;
IsAdmin = (SiteRole & ADMIN) > 0;
IsRegular = (SiteRole & REGULAR) > 0;
IsGuest = (SiteRole & GUEST) > 0;

Of course, you can also set the SiteRole by using the bitwise OR operator, as shown above:

UInt32 SiteRole = 0x00000000;
SiteRole |= ADMIN;

The real question is why do ADMIN and REGULAR have the same values? Maybe it's a bug.

Upvotes: 3

stackh34p
stackh34p

Reputation: 8999

These are bitwise shift operations. Bitwise shifts are used to transform the integer value of the enum mebers here to a different number. Each enum member will actually have the bit-shifted value. This is probably an obfuscation technique and is the same as setting a fixed integer value for each enum member.

Each integer has a binary reprsentation (like 0111011); bit shifting allows bits to move to the left (<<) or right (>>) depending on which operator is used.

For example:

10 << 0 means: 1010 (10 in binary form) moved with 0 bits left is 1010

5 << 1 means: 101 (5 in binary form) moved one bit to the left = 1010 (added a zero to the right) so 5 << 1 is 10 (because 1010 represents the number 10)

and etc.

In general the x << y operation can be seen as a fast way to calculate x * Pow(2, y);

You can read this article for more detailed info on bit shifting in .NET http://www.blackwasp.co.uk/CSharpShiftOperators.aspx

Upvotes: 1

Related Questions