このことを考慮:
[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
- マットエバンス - 10ms
- シルキー - 34ms
- ルーク - 1757ms
- グッファ - 4226ms
- トーマス・レベスク - 32810ms
Stevo3000 は明らかな勝者です (Matt Evans が銀メダルを保持しています)。
ご助力ありがとうございます。
更新 2: このソリューションはさらに高速に実行されます: 100 000 000 反復で 41 ミリ秒 (Stevo3000 よりも約 40 倍高速 (32 ビット OS))
UInt32 v = (UInt32)co;
v = v - ((v >> 1) & 0x55555555);
v = (v & 0x33333333) + ((v >> 2) & 0x33333333);
UInt32 count = ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24;