Considera:¿Manera eficiente de encontrar la longitud de enum de banderas?
[Flags]
enum Colors
{
Red=1,
Green=2,
Blue=4
}
Colors myColor=Colors.Red|Colors.Blue;
Actualmente, lo estoy haciendo de la siguiente manera:
int length=myColors.ToString().Split(new char[]{','}).Length;
pero espero que hay una manera más eficiente de encontrar la longitud, tal vez basado en operaciones BitSet.
Por favor, si es posible, explique por qué y cómo funciona su solución.
Además, si es un duplicado, apúntelo y eliminaré esta pregunta. Las únicas preguntas similares en SO que he podido encontrar estaban preocupadas por encontrar la longitud de todas las combinaciones posibles de Colors
enum, pero no de la variable myColors
.
ACTUALIZACIÓN: He Benchmarked cuidadosamente cada solución (1 000 000 repeticiones cada una) y aquí está el resultado:
- Stevo3000 - 8 ms
- MattEvans - 10 ms
- sedoso - 34ms
- Lucas - 1757ms
- Guffa - 4226ms
- Tomas Levesque - 32810ms
El Stevo3000 es un claro ganador (con Matt Evans con medalla de plata).
Muchas gracias por su ayuda.
ACTUALIZACIÓN 2: Esta solución funciona incluso más rápido: 41 ms para 100 000 000 iteraciones (aproximadamente 40 veces más rápido (OS de 32 bits) que Stevo3000)
UInt32 v = (UInt32)co;
v = v - ((v >> 1) & 0x55555555);
v = (v & 0x33333333) + ((v >> 2) & 0x33333333);
UInt32 count = ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24;
duplicado? http://stackoverflow.com/questions/677204 – strager
Sí, lo es, pero esta pregunta tiene respuestas más interesantes que la original. ¿Debo eliminar la pregunta? – Valentin