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
Imports System
Imports System.Numerics
Module Sample
Sub Main()
' BitOperations.Log2メソッドはuint/ulongに対してのみ使用できる
Dim val As UInteger = &B_1000_0000_0000_0000_0000_0000_0000_0001UI
' BitOperations.Log2で2を底とした対数を求める
Dim log2 As Integer = BitOperations.Log2(val)
' Math.Logで求める場合との比較
For Each _val As UInteger In New UInteger() {&H1UI, &H5UI, &H123UI, &HCAFEUI, &H80000000UI, &HFFFFFFFEUI}
Console.WriteLine($"val = {_val.ToBinary()} BitOperations.Log2(val) = {BitOperations.Log2(_val)} Math.Log(val, 2) = {Math.Log(_val, 2.0)}")
Next
End Sub
#Region "数値を二進数表記で文字列化するためのメソッド"
<System.Runtime.CompilerServices.Extension> _
Function ToBinary(ByVal number As UInteger) As String
Return "&B_" + Convert.ToString(number, 2).PadLeft(8 * Len(number), "0"c)
End Function
#End Region
End Module
実行結果
val = &B_00000000000000000000000000000001 BitOperations.Log2(val) = 0 Math.Log(val, 2) = 0 val = &B_00000000000000000000000000000101 BitOperations.Log2(val) = 2 Math.Log(val, 2) = 2.321928094887362 val = &B_00000000000000000000000100100011 BitOperations.Log2(val) = 8 Math.Log(val, 2) = 8.184875342908285 val = &B_00000000000000001100101011111110 BitOperations.Log2(val) = 15 Math.Log(val, 2) = 15.665280393678295 val = &B_10000000000000000000000000000000 BitOperations.Log2(val) = 31 Math.Log(val, 2) = 31.000000000000004 val = &B_11111111111111111111111111111110 BitOperations.Log2(val) = 31 Math.Log(val, 2) = 31.999999999328193