Module NearestPowerOfTwo
''' Rounds an unsigned integer to the nearest power of 2.
''' <returns>The nearest power of 2</returns>
Function RoundToNearestPowerOf2(n As UInteger) As UInteger
If n = 0 Then Return 0
Dim prevPower As UInteger = 1UI << (31 - LeadingZeroCount(n))
Dim nextPower As UInteger = prevPower << 1
If n - prevPower < nextPower - n Then
Return prevPower
Else
Return nextPower
End If
End Function
''' Counts leading zeros in a 32-bit unsigned integer.
Function LeadingZeroCount(value As UInteger) As Integer
Dim count As Integer = 0
Dim mask As UInteger = &H80000000UI
While (mask > 0 AndAlso (value And mask) = 0)
count += 1
mask >>= 1
End While
Return count
End Function
Sub Main()
Dim num As UInteger = 37
Console.WriteLine($"Nearest power of 2: {RoundToNearestPowerOf2(num)}")
End Sub
End Module
' run:
'
' Nearest power of 2: 32
'