In today’s world where processor memory is plentiful, many developers will often times just use a List<bool> for tracking a series of on/off values. Though the compiler can optimize this code somewhat, the CPU cycles spent managing the List<> structure when super fast bitwise operations could have been done, isn’t really the best way to go. So when one of my mentees asked about checking values in an enum bitmask, I thought it best to blog the answer for the benefit of others as well.
Let’s assume I’m trying to track the on/off values of say a permissions mask. I would define my values using the Flags attribute on an enum thus:
[Flags] public enum Permissions { All = 4, Update = 2, Read = 1, None = 0 }
If I now proceed to define a variable of our enum, I can set some of it’s bit values using the the bitwise AND operator thus:
Permissions perm = Permissions.Read & Permissions.Update;
If I now check for a value in the mask that is NOT turned on, it is done with the bitwise OR operator thus:
if ((perm & Permissions.All) != 0) { //it never gets here }
The same applies for values that ARE turned on in the mask thus:
if ((perm & Permissions.Update) != 0) { //it gets here }
In addition, I can turn on more flag altering future check for them thus:
perm = perm & Permissions.All; if ((perm & Permissions.All) != 0) { //now it gets here }
The major advantage to using the bitmask enum with bitwise operators is speed. These operations are done by the processor literally just flipping a single bit.
Happy coding!
Cheers
C
No comments:
Post a Comment
Comments are moderated only for the purpose of keeping pesky spammers at bay.