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
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
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上调试通过。)
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上调试通过。)