プログラミングとかブログ

Unity/C#/SRPGStudio/RPGツクールMVの情報とかその他気になったことを調べて書きます。

【C#】全ONビット桁数を返すコード

指定の数字に対してビットが立っている桁数のリストを返すメソッド

/// <summary>
/// 指定の数字の、ビットが立っている桁数を返す
/// </summary>
/// <param name="targetNum">調べる数字</param>
/// <param name="maxDigit">調べる最大桁数</param>
/// <returns>ONだった桁数のリスト</returns>
List<int> GetOnBitList(int targetNum, int maxDigit)
{
    var list = new List<int>();
  //ループごとに1ビット左シフトして全部判定
    for (int bit = 1; bit < (int)Math.Pow(2, maxDigit); bit <<= 1)
        if ((targetNum & bit) == bit)
            list.Add((int)Math.Log(targetNum & bit, 2) + 1);

    return list;
}

使用例

void Main(string[] args)
{
    var list = GetOnBitList(1023, 10);//1111111111
    list.ForEach(s => Console.Write(s + " "));
    Console.WriteLine();
    list = GetOnBitList(514, 10);//1000000010
    list.ForEach(s => Console.Write(s + " "));
}

//出力結果
//1 2 3 4 5 6 7 8 9 10
//2 10