The Flags attribute helps combine multiple options in one variable using bits. It makes checking and setting options easy and clear.
Flags attribute and bitwise enums in C Sharp (C#)
using System; [Flags] public enum Options { None = 0, OptionA = 1 << 0, // 1 OptionB = 1 << 1, // 2 OptionC = 1 << 2, // 4 OptionD = 1 << 3 // 8 }
The [Flags] attribute tells C# to treat the enum as a set of bits.
Each option should be a power of two (1, 2, 4, 8, etc.) so they can combine without overlap.
[Flags] public enum Permissions { None = 0, Read = 1, Write = 2, Execute = 4 }
Permissions userPermissions = Permissions.None;
// Empty flags, no permissions setPermissions userPermissions = Permissions.Read | Permissions.Write;
// Combining two flags using bitwise ORbool canRead = (userPermissions & Permissions.Read) == Permissions.Read;
// Checking if a flag is setThis program shows how to add, check, and remove flags using bitwise operations with a Flags enum.
using System; [Flags] public enum AccessRights { None = 0, Read = 1 << 0, // 1 Write = 1 << 1, // 2 Execute = 1 << 2 // 4 } public class Program { public static void Main() { AccessRights userRights = AccessRights.None; Console.WriteLine($"Initial rights: {userRights}"); // Add Read and Write rights userRights |= AccessRights.Read | AccessRights.Write; Console.WriteLine($"After adding Read and Write: {userRights}"); // Check if Execute right is set bool hasExecute = (userRights & AccessRights.Execute) == AccessRights.Execute; Console.WriteLine($"Has Execute right? {hasExecute}"); // Remove Write right userRights &= ~AccessRights.Write; Console.WriteLine($"After removing Write: {userRights}"); // Check if Write right is set bool hasWrite = (userRights & AccessRights.Write) == AccessRights.Write; Console.WriteLine($"Has Write right? {hasWrite}"); } }
Time complexity for checking, adding, or removing flags is O(1) because bitwise operations are very fast.
Space complexity is minimal since all flags are stored in one integer variable.
Common mistake: Not using powers of two for enum values causes flags to overlap and behave incorrectly.
Use Flags enums when you want to combine options efficiently; use regular enums when options are exclusive.
The [Flags] attribute allows combining multiple enum values using bits.
Use bitwise OR (|) to add flags, AND (&) to check flags, and AND with NOT (& ~) to remove flags.
Always assign enum values as powers of two to avoid overlap.
Practice
[Flags] attribute in C# enums?Solution
Step 1: Understand the role of
The[Flags][Flags]attribute marks an enum to be treated as a set of bit fields, allowing multiple values to be combined.Step 2: Compare with other options
Options B, C, and D describe unrelated enum behaviors. Only To allow combining multiple enum values using bitwise operations correctly describes the bitwise combination feature.Final Answer:
To allow combining multiple enum values using bitwise operations -> Option AQuick Check:
[Flags]enables bitwise combination [OK]
- Thinking [Flags] restricts enum to one value
- Confusing [Flags] with readonly or sequential enums
- Assuming [Flags] changes enum underlying type
[Flags] attribute?Solution
Step 1: Check enum values for bitwise uniqueness
Bitwise enums require values as powers of two (1, 2, 4, 8...) to avoid overlap.Step 2: Validate each option
[Flags] public enum Colors { Red = 1, Green = 2, Blue = 4 } uses 1, 2, 4 which are correct powers of two. [Flags] public enum Colors { Red = 0, Green = 1, Blue = 2 } starts with 0 which is valid for None but not typical for flags representing colors. public enum Colors { Red = 1, Green = 2, Blue = 3 } uses 3 which overlaps bits. [Flags] public enum Colors { Red = 1, Green = 1, Blue = 2 } repeats 1 twice, causing overlap.Final Answer:
[Flags] public enum Colors { Red = 1, Green = 2, Blue = 4 } -> Option BQuick Check:
Enum values must be powers of two [OK]
- Assigning zero to a flag value
- Using overlapping values like 3 or repeated numbers
- Forgetting the [Flags] attribute
[Flags]
public enum Permissions { Read = 1, Write = 2, Execute = 4 }
Permissions userPerms = Permissions.Read | Permissions.Execute;
bool canWrite = (userPerms & Permissions.Write) == Permissions.Write;
Console.WriteLine(canWrite);Solution
Step 1: Understand the combined flags
The variableuserPermscombinesRead (1)andExecute (4)using bitwise OR, resulting in 5.Step 2: Check if Write flag is set
The expression(userPerms & Permissions.Write)checks ifWrite (2)is set in 5. Since 5 & 2 = 0, it is not set, socanWriteis false.Final Answer:
False -> Option DQuick Check:
5 & 2 == 0 means Write not set [OK]
- Assuming OR sets all flags including Write
- Confusing bitwise AND with OR
- Expecting True because Write is in enum
[Flags] enum:
[Flags]
public enum Options { None = 0, First = 1, Second = 2, Third = 2 }
Options selected = Options.First | Options.Third;
Console.WriteLine(selected);Solution
Step 1: Check enum value assignments
BothSecondandThirdare assigned the value 2, causing overlap in flags.Step 2: Understand impact of duplicate values
Duplicate values meanOptions.Thirdis not unique, so bitwise operations may behave unexpectedly.Final Answer:
Duplicate enum values cause overlapping flags -> Option AQuick Check:
Enum values must be unique powers of two [OK]
- Ignoring duplicate values in flags enums
- Thinking 0 is invalid for None
- Assuming bitwise OR is wrong syntax
[Flags] enum:
[Flags]
public enum Features { None = 0, FeatureA = 1, FeatureB = 2, FeatureC = 4, FeatureD = 8 }
How would you write code to remove FeatureB from a variable currentFeatures that may contain multiple features combined?Solution
Step 1: Understand how to remove a flag
To remove a flag, use bitwise AND with the complement (NOT) of the flag.Step 2: Apply the operation to remove FeatureB
The expressioncurrentFeatures &= ~Features.FeatureB;clears the FeatureB bit while keeping others intact.Final Answer:
currentFeatures &= ~Features.FeatureB; -> Option CQuick Check:
Remove flag with AND and NOT [OK]
- Using OR (|) to remove flags instead of AND (&)
- Assigning flag directly, overwriting all others
- Using XOR (^) which toggles flags instead of removing
Ready to prove it?
Pass the test and this pattern moves unknown
