FUNCTION BitRshift16 LPARAMETERS tnNumber, tnShift LOCAL lnRetNumber * Clear anyting beyond lower 16 bit lnRetNumber = Bitand( tnNumber, 0xFFFF) * Perform right shift lnRetNumber = BitRshift(lnRetNumber, tnShift) * Check leftmost bit (sign) IF Bittest(lnRetNumber,15) * it's 16 bit negative number lnRetNumber = -(2^16) + lnRetNumber ENDIF RETURN lnRetNumber *-------------------------------------------------------------- FUNCTION BitAnd16 LPARAMETERS tnNumber1, tnNumber2 LOCAL lnRetNumber * Clear anyting beyond lower 16 bit and do bitwise AND lnRetNumber = Bitand( ; Bitand( tnNumber1, 0xFFFF), Bitand( tnNumber2, 0xFFFF)) * Check leftmost bit (sign) IF Bittest(lnRetNumber,15) * it's 16 bit negative number lnRetNumber = -(2^16) + lnRetNumber ENDIF RETURN lnRetNumber *------------------------------------------------------------- FUNCTION BitXor16 LPARAMETERS tnNumber1, tnNumber2 LOCAL lnRetNumber * Clear anyting beyond lower 16 bit and do bitwise XOR lnRetNumber = BitXor( ; Bitand( tnNumber1, 0xFFFF), Bitand( tnNumber2, 0xFFFF)) * Check leftmost bit (sign) IF Bittest(lnRetNumber,15) * it's 16 bit negative number lnRetNumber = -(2^16) + lnRetNumber ENDIF RETURN lnRetNumberAs you can see there's a pattern in the code: