Visual basic
HWSW Famulus
hwsw at famulus.hu
Sun Jan 1 13:08:36 CET 2006
> Most vagy nem szoktak vb 6.0-ban shift-elni,
alapbol nincs benne
>vagy nem értek a guglihoz. Kérlek segítsetek!
...ebben lehet valami
visual basic left shift
erre azert van par talalat... :-)
> electroboy
Public Function vbShiftLeft(ByVal Value As Long, _
Count As Integer) As Long
Dim i As Integer
vbShiftLeft = Value
For i = 1 To Count
vbShiftLeft = vbShiftLeft * 2
Next
End Function
Public Function vbShiftRight(ByVal Value As Long, _
Count As Integer) As Long
Dim i As Integer
vbShiftRight = Value
For i = 1 To Count
vbShiftRight = vbShiftRight \ 2
Next
End Function
-----------------------------------------------------------------------------
This tip demonstrates how to implement unsigned Right Shift and Left Shift
operators without overflow.
Start a new project then add a module. Add the following code to the module:
Option Explicit
Private m_lPower2(0 To 31) As Long
Public Function RShift(ByVal lThis As Long, ByVal lBits As Long) As Long
If (lBits <= 0) Then
RShift = lThis
ElseIf (lBits > 63) Then
' .. error ...
ElseIf (lBits > 31) Then
RShift = 0
Else
If (lThis And m_lPower2(31 - lBits)) = m_lPower2(31 - lBits) Then
RShift = (lThis And (m_lPower2(31 - lBits) - 1)) * m_lPower2(lBits)
Or m_lPower2(31)
Else
RShift = (lThis And (m_lPower2(31 - lBits) - 1)) * m_lPower2(lBits)
End If
End If
End Function
Public Function LShift(ByVal lThis As Long, ByVal lBits As Long) As Long
If (lBits <= 0) Then
LShift = lThis
ElseIf (lBits > 63) Then
' ... error ...
ElseIf (lBits > 31) Then
LShift = 0
Else
If (lThis And m_lPower2(31)) = m_lPower2(31) Then
LShift = (lThis And &H7FFFFFFF) \ m_lPower2(lBits) Or
m_lPower2(31 - lBits)
Else
LShift = lThis \ m_lPower2(lBits)
End If
End If
End Function
Public Sub Init()
m_lPower2(0) = &H1&
m_lPower2(1) = &H2&
m_lPower2(2) = &H4&
m_lPower2(3) = &H8&
m_lPower2(4) = &H10&
m_lPower2(5) = &H20&
m_lPower2(6) = &H40&
m_lPower2(7) = &H80&
m_lPower2(8) = &H100&
m_lPower2(9) = &H200&
m_lPower2(10) = &H400&
m_lPower2(11) = &H800&
m_lPower2(12) = &H1000&
m_lPower2(13) = &H2000&
m_lPower2(14) = &H4000&
m_lPower2(15) = &H8000&
m_lPower2(16) = &H10000
m_lPower2(17) = &H20000
m_lPower2(18) = &H40000
m_lPower2(19) = &H80000
m_lPower2(20) = &H100000
m_lPower2(21) = &H200000
m_lPower2(22) = &H400000
m_lPower2(23) = &H800000
m_lPower2(24) = &H1000000
m_lPower2(25) = &H2000000
m_lPower2(26) = &H4000000
m_lPower2(27) = &H8000000
m_lPower2(28) = &H10000000
m_lPower2(29) = &H20000000
m_lPower2(30) = &H40000000
m_lPower2(31) = &H80000000
End Sub
To use the code, you initially call Init to set up the precompiled array of
powers of 2. This is implemented to help speed the operation of the RShift
and LShift functions. Then you use the functions like this:
Dim lValue As Long
lValue = &HFFFFFFFF& ' VB thinks this is -1
Debug.Print RShift(lValue,4) ' Shift value right by 4 bits
' Answer is &HFFFFFFF0.
More information about the Elektro
mailing list