Implementing Unsigned Right and Left Shift Operators Author: Steve McMahon(steve@vbaccelerator.com) Keywords: Bit Manipulation Updated: 21/02/99 When translating C code to VB, often you come across the Right Shift and Left Shift operators ( > 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.   Related Tips and Articles: HiWords and LoWords from Long Values