una tesis publicados metodologia investigacion hacer estructura escribir ejemplos ejemplo como cientificos cientifico articulos articulo c# enums

c# - tesis - ejemplos de articulos cientificos publicados



¿Cómo eliminar un artículo para una enumeración OR? (6)

¿Qué hay de xor (^)?

Dado que el FLAG que está tratando de eliminar está allí, funcionará ... si no, tendrá que usar un &.

public enum Colour { None = 0, // default value RED = 2, BLUE = 4, GREEN = 8, YELLOW = 16, Orange = 18 // Combined value of RED and YELLOW } colors = (colors ^ Colour.RED) & colors;

Tengo una enumeración como:

public enum Blah { RED = 2, BLUE = 4, GREEN = 8, YELLOW = 16 } Blah colors = Blah.RED | Blah.BLUE | Blah.YELLOW;

¿Cómo podría eliminar el color azul de los colores variables?


Las otras respuestas son correctas, pero para eliminar específicamente el azul de arriba, escribiría:

colors &= ~Blah.BLUE;


Necesitas hacerlo con el ~ (complemento) de ''AZUL''.

El operador del complemento esencialmente invierte o ''voltea'' todos los bits para el tipo de datos dado. Como tal, si usa el operador AND ( & ) con algún valor (llamemos a ese valor ''X'') y el complemento de uno o más bits establecidos (llamemos a esos bits Q y su complemento ~Q ), la afirmación X & ~Q borra todos los bits que se establecieron en Q de X y devuelve el resultado.

Para eliminar o borrar los bits BLUE , use la siguiente declaración:

colorsWithoutBlue = colors & ~Blah.BLUE colors &= ~Blah.BLUE // This one removes the bit from ''colors'' itself

También puede especificar varios bits para borrar, de la siguiente manera:

colorsWithoutBlueOrRed = colors & ~(Blah.BLUE | Blah.RED) colors &= ~(Blah.BLUE | Blah.RED) // This one removes both bits from ''colors'' itself

o alternativamente ...

colorsWithoutBlueOrRed = colors & ~Blah.BLUE & ~Blah.RED colors &= ~Blah.BLUE & ~Blah.RED // This one removes both bits from ''colors'' itself

Entonces para resumir:

  • X | Q X | Q establece bit (s) Q
  • X & ~Q borra bit (s) Q
  • ~X voltea / invierte todos los bits en X

Pensé que esto podría ser útil para otras personas que tropezaron aquí como yo.

Tenga cuidado de cómo manejar cualquier valor enum que pueda establecer para tener un valor == 0 (a veces puede ser útil tener un estado Desconocido o Inactivo para una enumeración). Causa problemas al confiar en estas operaciones de manipulación de bits.

También cuando tiene valores enum que son combinaciones de otras potencias de 2 valores, por ejemplo

public enum Colour { None = 0, // default value RED = 2, BLUE = 4, GREEN = 8, YELLOW = 16, Orange = 18 // Combined value of RED and YELLOW }

En estos casos, un método de extensión como este podría ser útil:

public static Colour UnSet(this Colour states, Colour state) { if ((int)states == 0) return states; if (states == state) return Colour.None; return states & ~state; }

Y también el método Equivalente IsSet que maneja los valores combinados (aunque de una manera un poco hacky)

public static bool IsSet(this Colour states, Colour state) { // By default if not OR''d if (states == state) return true; // Combined: One or more bits need to be set if( state == Colour.Orange ) return 0 != (int)(states & state); // Non-combined: all bits need to be set return (states & state) == state; }


Puedes usar esto:

colors &= ~Blah.RED;


And not es así ...............................

Blah.RED | Blah.YELLOW == (Blah.RED | Blah.BLUE | Blah.YELLOW) & ~Blah.BLUE;