Bird
Raised Fist0
C Sharp (C#)programming~10 mins

Flags attribute and bitwise enums in C Sharp (C#) - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Flags attribute and bitwise enums
Define enum with Flags attribute
↓
Assign combined flags using bitwise OR
↓
Check flags using bitwise AND
↓
Use flags in conditions or output
This flow shows how to define an enum with Flags, combine values using bitwise OR, and check flags using bitwise AND.
Execution Sample
C Sharp (C#)
using System;
[Flags]
enum Days { None=0, Mon=1, Tue=2, Wed=4 }
class Program {
    static void Main() {
        Days meeting = Days.Mon | Days.Wed;
        bool hasTue = (meeting & Days.Tue) == Days.Tue;
        Console.WriteLine(meeting);
        Console.WriteLine(hasTue);
    }
}
This code defines a Flags enum for days, combines Monday and Wednesday, checks if Tuesday is included, and prints results.
Execution Table
StepActionExpressionResultExplanation
1Define enum Days with FlagsDays { None=0, Mon=1, Tue=2, Wed=4 }Enum definedEnum values assigned powers of two for bitwise use
2Combine flags Mon and WedDays.Mon | Days.Wed51 (Mon) OR 4 (Wed) = 5, combined flags value
3Assign combined flags to meetingmeeting = 5meeting = 5meeting holds Mon and Wed flags
4Check if Tue flag is set(meeting & Days.Tue) == Days.Tue(5 & 2) == 2False, because 5 & 2 = 0, Tue not included
5Print meetingConsole.WriteLine(meeting)Mon, WedFlags enum prints combined names
6Print hasTueConsole.WriteLine(hasTue)FalseBoolean result of Tue check
7End--Program ends
💡 All steps executed; program ends after printing results.
Variable Tracker
VariableStartAfter Step 2After Step 3After Step 4Final
meetingundefinedundefined5 (Mon | Wed)5 (unchanged)5 (unchanged)
hasTueundefinedundefinedundefinedFalseFalse
Key Moments - 3 Insights
Why do we use powers of two (1, 2, 4, ...) for enum values?
Using powers of two ensures each flag corresponds to a unique bit, so they can be combined and checked independently as shown in step 2 and 4 of the execution_table.
Why does (meeting & Days.Tue) == Days.Tue return false when Tue is not set?
Because bitwise AND returns zero if the bit for Tue is not set in meeting. Step 4 shows (5 & 2) equals 0, so the condition is false.
How does printing the combined flags show 'Mon, Wed' instead of a number?
The Flags attribute tells C# to print combined flag names separated by commas, as seen in step 5 of the execution_table.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 2, what is the combined value of Days.Mon | Days.Wed?
A5
B3
C6
D7
💡 Hint
Check the 'Result' column in step 2 of the execution_table.
At which step does the program check if Tuesday is included in meeting?
AStep 3
BStep 5
CStep 4
DStep 6
💡 Hint
Look for the bitwise AND check in the execution_table.
If we add Days.Tue to meeting using bitwise OR, what would be the new value of meeting?
A6
B7
C3
D4
💡 Hint
Add the values 5 (Mon|Wed) and 2 (Tue) using bitwise OR: see step 2 for reference.
Concept Snapshot
[Flags] enum uses powers of two values
Combine flags with bitwise OR (|)
Check flags with bitwise AND (&)
Printing combined flags shows names
Use to represent multiple options in one variable
Full Transcript
This example shows how to use the Flags attribute with enums in C#. We define days with values 1, 2, 4 so each is a unique bit. We combine Monday and Wednesday using bitwise OR to get 5. We check if Tuesday is included by bitwise AND with 2, which returns false. Printing the combined flags shows 'Mon, Wed'. This technique lets us store multiple options in one variable and check them easily.

Practice

(1/5)
1. What is the main purpose of the [Flags] attribute in C# enums?
easy
A. To allow combining multiple enum values using bitwise operations
B. To make enum values readonly
C. To automatically assign sequential integer values
D. To restrict enum values to a single choice only

Solution

  1. Step 1: Understand the role of [Flags]

    The [Flags] attribute marks an enum to be treated as a set of bit fields, allowing multiple values to be combined.
  2. 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.
  3. Final Answer:

    To allow combining multiple enum values using bitwise operations -> Option A
  4. Quick Check:

    [Flags] enables bitwise combination [OK]
Hint: Remember: [Flags] means combine enum values with bits [OK]
Common Mistakes:
  • Thinking [Flags] restricts enum to one value
  • Confusing [Flags] with readonly or sequential enums
  • Assuming [Flags] changes enum underlying type
2. Which of the following is the correct way to define a bitwise enum with the [Flags] attribute?
easy
A. [Flags] public enum Colors { Red = 0, Green = 1, Blue = 2 }
B. [Flags] public enum Colors { Red = 1, Green = 2, Blue = 4 }
C. public enum Colors { Red = 1, Green = 2, Blue = 3 }
D. [Flags] public enum Colors { Red = 1, Green = 1, Blue = 2 }

Solution

  1. Step 1: Check enum values for bitwise uniqueness

    Bitwise enums require values as powers of two (1, 2, 4, 8...) to avoid overlap.
  2. 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.
  3. Final Answer:

    [Flags] public enum Colors { Red = 1, Green = 2, Blue = 4 } -> Option B
  4. Quick Check:

    Enum values must be powers of two [OK]
Hint: Use powers of two for flags enum values [OK]
Common Mistakes:
  • Assigning zero to a flag value
  • Using overlapping values like 3 or repeated numbers
  • Forgetting the [Flags] attribute
3. Given the enum and code below, what is the output?
[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);
medium
A. True
B. Compile-time error
C. Runtime exception
D. False

Solution

  1. Step 1: Understand the combined flags

    The variable userPerms combines Read (1) and Execute (4) using bitwise OR, resulting in 5.
  2. Step 2: Check if Write flag is set

    The expression (userPerms & Permissions.Write) checks if Write (2) is set in 5. Since 5 & 2 = 0, it is not set, so canWrite is false.
  3. Final Answer:

    False -> Option D
  4. Quick Check:

    5 & 2 == 0 means Write not set [OK]
Hint: Check flags with AND (&) and compare to flag value [OK]
Common Mistakes:
  • Assuming OR sets all flags including Write
  • Confusing bitwise AND with OR
  • Expecting True because Write is in enum
4. Identify the error in the following code snippet using a [Flags] enum:
[Flags]
public enum Options { None = 0, First = 1, Second = 2, Third = 2 }

Options selected = Options.First | Options.Third;
Console.WriteLine(selected);
medium
A. Duplicate enum values cause overlapping flags
B. Missing [Flags] attribute
C. Bitwise OR operator is incorrect
D. Enum values must start from 1, not 0

Solution

  1. Step 1: Check enum value assignments

    Both Second and Third are assigned the value 2, causing overlap in flags.
  2. Step 2: Understand impact of duplicate values

    Duplicate values mean Options.Third is not unique, so bitwise operations may behave unexpectedly.
  3. Final Answer:

    Duplicate enum values cause overlapping flags -> Option A
  4. Quick Check:

    Enum values must be unique powers of two [OK]
Hint: Check for unique powers of two in enum values [OK]
Common Mistakes:
  • Ignoring duplicate values in flags enums
  • Thinking 0 is invalid for None
  • Assuming bitwise OR is wrong syntax
5. You have the following [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?
hard
A. currentFeatures ^= Features.FeatureB;
B. currentFeatures |= Features.FeatureB;
C. currentFeatures &= ~Features.FeatureB;
D. currentFeatures = Features.FeatureB;

Solution

  1. Step 1: Understand how to remove a flag

    To remove a flag, use bitwise AND with the complement (NOT) of the flag.
  2. Step 2: Apply the operation to remove FeatureB

    The expression currentFeatures &= ~Features.FeatureB; clears the FeatureB bit while keeping others intact.
  3. Final Answer:

    currentFeatures &= ~Features.FeatureB; -> Option C
  4. Quick Check:

    Remove flag with AND and NOT [OK]
Hint: Remove flags with AND and NOT (~) operator [OK]
Common Mistakes:
  • Using OR (|) to remove flags instead of AND (&)
  • Assigning flag directly, overwriting all others
  • Using XOR (^) which toggles flags instead of removing
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard