考虑一下:
[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 - 8ms
- 马特埃文斯 - 10 毫秒
- 丝滑 - 34 毫秒
- 卢克 - 1757 毫秒
- 古法 - 4226ms
- Tomas Levesque - 32810 毫秒
Stevo3000 无疑是赢家(Matt Evans 获得银牌)。
非常感谢您的帮助。
更新 2:此解决方案运行得更快:100 000 000 次迭代需要 41 毫秒(大约比 Stevo3000 快 40 倍(32 位操作系统))
UInt32 v = (UInt32)co;
v = v - ((v >> 1) & 0x55555555);
v = (v & 0x33333333) + ((v >> 2) & 0x33333333);
UInt32 count = ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24;