2013-06-12 31 views
0

不使用對數,如何在BASIC中將2的冪的序列轉換爲線性整數?將2的冪轉換爲無對數的線性序列

Input: 0, 1, 2, 4, 8, 16, 32, 64, 128 
Output: 0, 1, 2, 3, 4, 5, 6, 7, 8 
+1

有很快的位擺動方法來做基2對數。我有ac#版本(不基本),但你可以在這裏看到一些算法:http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogLookup – hatchet

回答

3

是的,你將數字轉換爲二進制。例如,64的二進制值是:1000000。由於1是在第七的位置,你知道所需的值是7,下面是一個Visual Basic程序要做到這一點:

Public Function DecimalToBinary(DecimalNum As Long) As String 
    Dim tmp As String 
    Dim n As Long= 
    n = DecimalNum 
    tmp = Trim(Str(n Mod 2)) 
    n = n \ 2 
    Do While n <> 0 
     tmp = Trim(Str(n Mod 2)) & tmp 
     n = n \ 2 
    Loop 
    DecimalToBinary = tmp 
End Function 

在這種算法中的值附加到一個字符串,但你可以將它們存儲在1和0的數組中。還要注意,通過上述算法產生的字符串的長度,您總是可以獲得2的冪。例如,字符串「1001010」的長度是7,這意味着該數字介於64和127之間。

+0

@Doc你可以將它標記爲接受的答案,如果你正在接受它? –

1

這是進一步向下的c#算法的Visual Basic轉換。這是一個整數Log2函數。它使用一個以前初始化的數組。這個(和許多其他位的小提琴)可以在這裏找到:http://graphics.stanford.edu/~seander/bithacks.html

這個算法的優點,以及它爲什麼速度快,是因爲它執行基數2對數無非是幾個簡單的算術運算和一個數組查找。

Public Class BitHelper 
    ' Methods 
    Shared Sub New() 
     BitHelper.logTable256(0) = BitHelper.logTable256(1) = 0 
     Dim i As Integer 
     For i = 2 To 256 - 1 
      BitHelper.logTable256(i) = (1 + BitHelper.logTable256((i/2))) 
     Next i 
    End Sub 

    Public Shared Function Log2(ByVal number As Integer) As Byte 
     If (number <= 65535) Then 
      If (number > 255) Then 
       Return CByte((8 + BitHelper.logTable256((number >> 8)))) 
      End If 
      Return CByte(BitHelper.logTable256(number)) 
     End If 
     If (number <= 16777215) Then 
      Return CByte((16 + BitHelper.logTable256((number >> 16)))) 
     End If 
     Return CByte((24 + BitHelper.logTable256((number >> 24)))) 
    End Function 

    Private Shared ReadOnly logTable256 As Integer() = New Integer(256 - 1) {} 
End Class 

這是原來的c#代碼。它是我之前做的一個更大的BitHelper類的一個子集。

/// <summary> 
/// Helper methods for bit twiddling. Much of the ideas used come 
/// from http://graphics.stanford.edu/~seander/bithacks.html 
/// </summary> 
public static class BitHelper 
{ 
    private static readonly int[] logTable256 = new int[256]; 

    /// <summary> 
    /// Initialize BitHelper class. 
    /// </summary> 
    static BitHelper() 
    { 
     logTable256[0] = logTable256[1] = 0; 
     for (int i = 2; i < 256; i++) { 
      logTable256[i] = 1 + logTable256[i/2]; 
     } 
    } 

    /// <summary> 
    /// Determines the integer logarithm base 2 (Floor(Log2(number))) of the specified number. 
    /// </summary> 
    /// <param name="number">The number for which the base 2 log is desired.</param> 
    /// <returns>The base 2 log of the number.</returns> 
    public static byte Log2(int number) { 
     if (number <= 0xffff) { 
      if (number > 0xff) { 
       return (byte) (8 + logTable256[number >> 8]); 
      } else { 
       return (byte) logTable256[number]; 
      } 
     } else if (number <= 0xffffff) { 
      return (byte) (16 + logTable256[number >> 16]); 
     } else { 
      return (byte) (24 + logTable256[number >> 24]); 
     } 
    } 
}