When translating C code to VB, often you come across the Right Shift and Left Shift operators ( << and >> respectively ). There is no inbuilt support for Right and Left Shift in VB, so you have to code your own. One of the main problems with replacing these functions is that C code often uses them in unsigned operations. VB doesn't support unsigned long integers either, so code can often fail if the highest bit of the long value is involved.
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.