Pregunta

Mi objeto Item tiene varios estados binarios que pueden combinarse

bool CanBeSold;
bool CanBeBought;
bool CanBeExchanged;

necesito para almacenar combinación actual de valores en una variable. La razón es que necesito para almacenar este valor en dB. En C ++ me gustaría crear una máscara de bits donde un estado ocupa poco de bits. Es una buena práctica en .NET?

¿Fue útil?

Solución

Puede utilizar una enumeración con el atributo Flags:

[Flags]
enum MyStates {
  CanBeSold = 1,
  CanBeBought = 2,
  CanBeExchanged = 4
}

Dado que las enumeraciones son tipos de datos integrales por debajo de usted puede combinarlos de la manera habitual:

state = MyStates.CanBeSold | MyStates.CanBeExchanged

Tenga en cuenta que esto sólo funciona cuando los valores de enumeración son potencias de dos (como Doug Ferguson se señala en un comentario), por lo que se puede combinar con facilidad y no se superponen cuando se fijan los múltiples.

También puede definir valores como combinaciones de varios otros valores:

 CanBeSoldOrBought = CanBeSold | CanBeBought

o

 CanBeSoldOrBought = 3

que a su vez también funciona como se esperaba. Esto puede verse, por ejemplo, para los permisos de archivos en ReadWrite por lo general es una combinación de los bits de lectura y escritura.

Y sí, eso es una práctica bastante común. El marco en sí también lo utiliza en varios lugares.

La forma habitual de comprobar para ser ajustado un poco particular, es entonces

if ((state & MyStates.CanBeSold) != 0) { ... }

Otros consejos

Crea una enum donde los valores corresponden a los bits en un número entero. La adición de las Banderas atribuye permitieron hacer más operaciones de bits en los valores de enumeración.

[Flags]
public enum CanBe {
  Sold = 1,
  Bought = 2,
  Exchanged = 4
}

Ahora sólo puede utilizar el operador or entre los valores:

CanBe can = CabBe.Sold | CanBe.Exchanged.

Se puede añadir un estado con el | = operador:

can |= CanBe.Sold;

O varios estados:

can |= CanBe.Sold | CanBe.Bought;

Puede mantener un estado con el & operador =:

can &= CanBe.Sold;

O varios estados:

can &= CanBe.Sold | CanBe.Bought;

Puede eliminar estados utilizando el operador ~ para crear un complemento a un valor:

can &= ~CabBe.Bough;

O estados seveal:

can &= ~(CabBe.Bough | CanBe.Exchanged);

Puede comprobar si hay un estado usando el operador &:

if ((can & CanBe.Sold) != 0) ...

O varios estados a la vez:

if ((can & (CanBe.Sold | CanBe.Bought)) != 0) ...

O compruebe que varios estados son todo listo:

if ((can & (CanBe.Sold | CanBe.Bought)) == (CanBe.Sold | CanBe.Bought)) ...

Puede hacer esto con máscaras de bits en .NET también.

Dentro de su enumeración puede definir sus estados como valores

public enum ItemState { CanBeSold = 1; CanBeBought = 2; CanBeExchanged = 4 }

A continuación, dentro de su objeto, puede hacer

if (item.State ^ ItemState.CanBeSold) ....

Se puede utilizar una enumeración Banderas con cada bit especificado

[Flags]
enum MyStates {
    CanBeSold = 0x1,
    CanBeBought = 0x2,
    CanBeExchanged = 0x4,
}

MyStates m_Flags;

// to set a flag:
m_Flags |= MyStates.CanBeSold;

// to unset a flag:
m_Flags &= ~MyStates.CanBeSold;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top