Entender la manipulación de bits es util en escenario donde tenemos que usar menos cantidad de memoria para guardar datos o estados

Attributo Flags

El Attributo Flags permite poder usar más de una option del enumerado y almacearlo en una variable, Por ejemplo el siguiente enum:

[Flags]
public enum BookingOptions
{
  None = 0,
  EnSuite = 1,
  SeaView = 2,
  StairFreeAccess = 4,
  Breakfast = 8
}

Dados los valores del enum, podemos elegir uno o varios valores del enum, por ejemplo:

BookingOptions bookingOptionsSelected = BookingOptions.SeaView | BookingOptions.Breakfast;

Console.WriteLine(bookingOptionsSelected);
//Output: SeaView, Breakfast

Detras de escena

El atributo Flags permite aplicar el operador de bits Or entre los atributos, dado que cada item del enumerado tiene un valor binario:

  Breakfast   StairFreeAccess   SeaView   EnSuite  
Enum Value   8 4 2 1
Breakfast   1 0 0 0
EnSuite   0 0 1 0

se eligieron dos valores Breakfast con valor 8 y en binario 1000 y EnSuite con valor 2 y en binario 0010, entonces necesitamos combinar los valores en un solo byte

         
Breakfast   1 0 0 0
EnSuite   0 0 1 0
Combine with OR   1 0 1 0

El nuevo valor contiene ambos valores del enumerado en una sola variable

Verificacion de valores

Luego de tener una variable con ambos valores, la pregunta es como podemos saber que valores contiene.

Esto lo podemos saber usando el operador de bits AND

         
bookingOptionsSelected   1 0 1 0
Breakfast 1 0 0 0
resultado op AND 1 0 0 0

la operacion es la siguiente:

  1. Tenemos la variable “bookingOptionsSelected” con los dos valores del enumerado
  2. Tenemos el valor que queremos verificar (“Breakfast”) que se encuentre dentro de la variable
  3. Si el valor resultante de aplicar el operador AND entre el valor de la variable y el valor a verificar es igual al valor a verificar entonces la variable “bookingOptionsSelected” si contiene el valor Breakfast

la verificacion en c#:

if ((bookingOptionsSelected & BookingOptions.Breakfast) != 0)
{
  //....
}

alvan

Software Developer


Bitwise Operations - Parte I Bitwise Operations - Parte I | Alvaro Carpio