Log2メソッドは、2を底とした対数(2進対数、⌊log2n⌋・⌊lb n⌋)を求めます。
Math.Logメソッドによっても2進対数を求めることはできますが、LeadingZeroCountメソッド相当のビット演算によって計算される点、これに従い戻り値が整数(⌊lb n⌋)となる点が異なります。 たとえば、値が100(2)から111(2)の場合、Log2メソッドの結果はすべて2(10)となります。 Mathクラスを使った場合にMath.Floor(Math.Log(2.0, n))
とすることで得られる値が、Log2メソッドの結果となります。
Log2メソッドは、uint
/UInteger
, ulong
/ULong
の整数型のみに対して定義されています。 結果はint
/Integer
で返されます。
BitOperations.Log2メソッドで2進対数を求める .NET Core 3.0
using System;
using System.Numerics;
static class Sample {
static void Main()
{
// BitOperations.Log2メソッドはuint/ulongに対してのみ使用できる
uint val = 0b_1000_0000_0000_0000_0000_0000_0000_0001;
// BitOperations.Log2で2を底とした対数を求める
int log2 = BitOperations.Log2(val);
// Math.Logで求める場合との比較
foreach (var _val in new uint[] {0x1u, 0x5u, 0x123u, 0xCAFEu, 0x80000000u, 0xFFFFFFFEu}) {
Console.WriteLine($"val = {_val.ToBinary()}\tBitOperations.Log2(val) = {BitOperations.Log2(_val)}\tMath.Log(val, 2) = {Math.Log(_val, 2.0)}");
}
}
#region "数値を二進数表記で文字列化するためのメソッド"
static string ToBinary(this uint number) => "0b_" + Convert.ToString(number, 2).PadLeft(8 * sizeof(uint), '0');
#endregion
}
実行結果
val = 0b_00000000000000000000000000000001 BitOperations.Log2(val) = 0 Math.Log(val, 2) = 0 val = 0b_00000000000000000000000000000101 BitOperations.Log2(val) = 2 Math.Log(val, 2) = 2.321928094887362 val = 0b_00000000000000000000000100100011 BitOperations.Log2(val) = 8 Math.Log(val, 2) = 8.184875342908285 val = 0b_00000000000000001100101011111110 BitOperations.Log2(val) = 15 Math.Log(val, 2) = 15.665280393678295 val = 0b_10000000000000000000000000000000 BitOperations.Log2(val) = 31 Math.Log(val, 2) = 31.000000000000004 val = 0b_11111111111111111111111111111110 BitOperations.Log2(val) = 31 Math.Log(val, 2) = 31.999999999328193