「最短」の方法を探している場合:
Orientation o = Orientation.East | Orientation.West; // o.ToString() = "East, West"
var c = o.ToString().Split().Count();
またはさらに短い:
var c = (o + "").Split().Count();
アップデート
255 を超える値をサポートするには、これらの醜いハックのいずれかを使用できます。
Orientation o = (Orientation) 1023;
var c = ((Orientation)(byte)o + "").Split().Count();
c = ((Orientation)((int)o & 255) + "").Split().Count();
または単に列挙型をバイトとして定義します。
[Flags]
public enum Orientation : byte
{
North = 1,
North_East = 2,
East = 4,
South_East = 8,
South = 16,
South_West = 32,
West = 64,
North_West = 128
}
更新 2
個人的には、特にビット カウントが必要な場合は、プロダクション コードで string メソッドを使用しません。
とにかく、私はちょうど楽しみのために別のハックを考えました. 基数 2 のログは、1 ビットが設定されている場合は整数を返し、0 の場合は -Infinity を返し、複数のビットが設定されている場合はそれ以外を返します。例えば
Math.Log(0, 2 ) // -Infinity
Math.Log(0, 64) // 6.0
Math.Log(0, 65) // 6.0223678130284544
そのため、(byte)go != 0
フラグが設定されているかどうかを確認してから、フラグが 1 つだけ設定されているかどうかを確認するために使用できますMath.Log((byte)go, 2) % 1 == 0
。
しかし、dasblinkenlight のソリューションが最善のようです。