Учтите это:
[Flags]
enum Colors
{
Red=1,
Green=2,
Blue=4
}
Colors myColor=Colors.Red|Colors.Blue;
В настоящее время я делаю это следующим образом:
int length=myColors.ToString().Split(new char[]{','}).Length;
Но я надеюсь, что есть более эффективный способ определения длины, возможно, основанный на битовых операциях.
Пожалуйста, если возможно, объясните, почему и как работает ваше решение.
Кроме того, если это дубликат, укажите на него, и я удалю этот вопрос. Единственные похожие вопросы по SO, которые я смог найти, касались определения длины всех возможных комбинаций перечисления Colors
, но не переменной myColors
.
ОБНОВЛЕНИЕ: я тщательно проверил каждое решение (1 000 000 итераций каждое), и вот результаты:
- Stevo3000 - 8 мс
- MattEvans - 10 мс
- Шелковистая - 34мс
- Люк - 1757мс
- Гуффа - 4226мс
- Томас Левеск - 32810мс
Stevo3000 - явный победитель (с Мэттом Эвансом, держащим серебряную медаль).
Большое спасибо за помощь.
ОБНОВЛЕНИЕ 2:
Это решение работает еще быстрее: 41 мс на 100 000 000 итераций (примерно в 40 раз быстрее (32-разрядная ОС), чем Stevo3000)
UInt32 v = (UInt32)co;
v = v - ((v >> 1) & 0x55555555);
v = (v & 0x33333333) + ((v >> 2) & 0x33333333);
UInt32 count = ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24;