vb5核心技术中的一个函数,以供参考
Function LShiftWord(ByVal w As Integer, ByVal c As Integer) As Integer
    BugAssert c >= 0 And c <= 15
    Dim dw As Long
    dw = w * Power2(c)
    If dw And &H8000& Then
        LShiftWord = CInt(dw And &H7FFF&) Or &H8000
    Else
        LShiftWord = dw And &HFFFF&
    End If
End Function'查找2的幂
function Power2(ByVal i As Integer) As Long
dim aPower2(0 To 31) As Long
if i >= 0 And i <= 31'
    If aPower2(0) = 0 Then
        aPower2(0) = &H1&
        aPower2(1) = &H2&
        aPower2(2) = &H4&
        aPower2(3) = &H8&
        aPower2(4) = &H10&
        aPower2(5) = &H20&
        aPower2(6) = &H40&
        aPower2(7) = &H80&
        aPower2(8) = &H100&
        aPower2(9) = &H200&
        aPower2(10) = &H400&
        aPower2(11) = &H800&
        aPower2(12) = &H1000&
        aPower2(13) = &H2000&
        aPower2(14) = &H4000&
        aPower2(15) = &H8000&
        aPower2(16) = &H10000
        aPower2(17) = &H20000
        aPower2(18) = &H40000
        aPower2(19) = &H80000
        aPower2(20) = &H100000
        aPower2(21) = &H200000
        aPower2(22) = &H400000
        aPower2(23) = &H800000
        aPower2(24) = &H1000000
        aPower2(25) = &H2000000
        aPower2(26) = &H4000000
        aPower2(27) = &H8000000
        aPower2(28) = &H10000000
        aPower2(29) = &H20000000
        aPower2(30) = &H40000000
        aPower2(31) = &H80000000
    End If
end if
    Power2 = aPower2(i)
end function

解决方案 »

  1.   

    用VB进行移位操作   VB没有提供移位操作的指令和函数,只提供and(与)、or(或)、xor(异或)、eqv(同或)、not(非)等几个运算符,而编程时有时需要对一个字节进行移位操作(如进行加密),怎么办?其实只用and、or二个运算符即可搞掂。例如要将变量byte1的第八位置1(假设byte1的二进制值为01001101),则只需byte1 or &h80 (即01001101 or 10000000),如要将第八位置0,则只需byte1 and &h7f。请看下面程序段是如何实现循环左移的: '将byte1左移n位 
    Public Function byteleft(byte1 As Byte, n As Integer) As Byte 
      Dim intem As Byte '临时变量 
      Dim intem1 As Byte '临时变量 
      Dim x, y As Integer 
      intem1 = byte1 
      For x = 1 To n '移多少位就循环多少次 
       For y = 8 To 1 Step -1 '从第八位(左边第一位)开始循环左移 
         Select Case y 
          Case 8 
            If (intem1 And &H80) = &H80 Then '如果临时变量intem1的第八位是1 
             intem = &H1 '则将临时变量intem置1, 
            Else 
             intem = &H0 '反之置0 
            End If 
          Case 7 
            If (intem1 And &H40) = &H40 Then '如果临时变量intem1的第七位是1 
             intem1 = intem1 Or &H80 '则将其第八位置1(其它位不变), 
            Else 
             intem1 = intem1 And &H7F '反之将第八位置0(其它位不变) 
            End If 
          Case 6 
            If (intem1 And &H20) = &H20 Then '操作与上面相同 
             intem1 = intem1 Or &H40 
            Else 
             intem1 = intem1 And &HBF 
            End If 
          Case 5 
            If (intem1 And &H10) = &H10 Then 
             intem1 = intem1 Or &H20 
            Else 
             intem1 = intem1 And &HDF 
            End If 
          Case 4 
            If (intem1 And &H8) = &H8 Then 
             intem1 = intem1 Or &H10 
            Else 
             intem1 = intem1 And &HEF 
            End If 
          Case 3 
            If (intem1 And &H4) = &H4 Then 
             intem1 = intem1 Or &H8 
            Else 
             intem1 = intem1 And &HF7 
            End If 
          Case 2 
            If (intem1 And &H2) = &H2 Then 
             intem1 = intem1 Or &H4 
            Else 
             intem1 = intem1 And &HFB 
            End If 
          Case 1 
            If (intem1 And &H1) = &H1 Then 
             intem1 = intem1 Or &H2 
            Else 
             intem1 = intem1 And &HFD 
            End If 
            If intem = &H1 Then '移完第一位后,如果intem是1(即第八位是1) 
             intem1 = intem1 Or &H1 '则将intem1的第一位置1 
            Else 
             intem1 = intem1 And &HFE '反之置0 
            End If 
         End Select 
       Next y 
      Next x 
      byteleft = intem1 '将intem1的值返回给函数名 
    End Function 
      参照此程序段,不难实现循环右移。 
    (此程序段在VB5上调试通过。) 
      

  2.   

    用VB进行移位操作   VB没有提供移位操作的指令和函数,只提供and(与)、or(或)、xor(异或)、eqv(同或)、not(非)等几个运算符,而编程时有时需要对一个字节进行移位操作(如进行加密),怎么办?其实只用and、or二个运算符即可搞掂。例如要将变量byte1的第八位置1(假设byte1的二进制值为01001101),则只需byte1 or &h80 (即01001101 or 10000000),如要将第八位置0,则只需byte1 and &h7f。请看下面程序段是如何实现循环左移的: '将byte1左移n位 
    Public Function byteleft(byte1 As Byte, n As Integer) As Byte 
      Dim intem As Byte '临时变量 
      Dim intem1 As Byte '临时变量 
      Dim x, y As Integer 
      intem1 = byte1 
      For x = 1 To n '移多少位就循环多少次 
       For y = 8 To 1 Step -1 '从第八位(左边第一位)开始循环左移 
         Select Case y 
          Case 8 
            If (intem1 And &H80) = &H80 Then '如果临时变量intem1的第八位是1 
             intem = &H1 '则将临时变量intem置1, 
            Else 
             intem = &H0 '反之置0 
            End If 
          Case 7 
            If (intem1 And &H40) = &H40 Then '如果临时变量intem1的第七位是1 
             intem1 = intem1 Or &H80 '则将其第八位置1(其它位不变), 
            Else 
             intem1 = intem1 And &H7F '反之将第八位置0(其它位不变) 
            End If 
          Case 6 
            If (intem1 And &H20) = &H20 Then '操作与上面相同 
             intem1 = intem1 Or &H40 
            Else 
             intem1 = intem1 And &HBF 
            End If 
          Case 5 
            If (intem1 And &H10) = &H10 Then 
             intem1 = intem1 Or &H20 
            Else 
             intem1 = intem1 And &HDF 
            End If 
          Case 4 
            If (intem1 And &H8) = &H8 Then 
             intem1 = intem1 Or &H10 
            Else 
             intem1 = intem1 And &HEF 
            End If 
          Case 3 
            If (intem1 And &H4) = &H4 Then 
             intem1 = intem1 Or &H8 
            Else 
             intem1 = intem1 And &HF7 
            End If 
          Case 2 
            If (intem1 And &H2) = &H2 Then 
             intem1 = intem1 Or &H4 
            Else 
             intem1 = intem1 And &HFB 
            End If 
          Case 1 
            If (intem1 And &H1) = &H1 Then 
             intem1 = intem1 Or &H2 
            Else 
             intem1 = intem1 And &HFD 
            End If 
            If intem = &H1 Then '移完第一位后,如果intem是1(即第八位是1) 
             intem1 = intem1 Or &H1 '则将intem1的第一位置1 
            Else 
             intem1 = intem1 And &HFE '反之置0 
            End If 
         End Select 
       Next y 
      Next x 
      byteleft = intem1 '将intem1的值返回给函数名 
    End Function 
      参照此程序段,不难实现循环右移。 
    (此程序段在VB5上调试通过。)