;*****************************************************************************
;+
;*NAME:
;
; decom_2s_complement
;
;*PURPOSE:
;
; Decom 2 bytes into a long integer via 2's complement.
;
;*CALLING SEQUENCE:
;
; decom_2s_complement,buff,value
;
;*PARAMETERS:
;
; buff (required) (input) (array) (byte)
; An array of 2 bytes in order as read from file.
;
; value (required) (output) (scalar) (longwod integer)
; The calculated value.
;
;*EXAMPLES:
;
; decom_2s_complement,buff,value
;
;*SYSTEM VARIABLES USED:
;
; none
;
;*INTERACTIVE INPUT:
;
; none
;
;*SUBROUTINES CALLED:
;
; none
;
;*FILES USED:
;
; none
;
;*SIDE EFFECTS:
;
; none
;
;*RESTRICTIONS:
;
; Only for use with 2 bytes
;
;*NOTES:
;
;
;*PROCEDURE:
;
; - Check inputs
; - Bytes to bits
; - calculate value
;
;*MODIFICATION HISTORY:
;
; 26 Jul 2010 wrote
; 29 Jul 2010 generalized the code
; 3 Aug 2010 RCS
;
;-
;******************************************************************************
pro decom_2s_complement,buff,value
; check input parameters
if (n_params(0) ne 2) then begin
print,'decom_2s_complement,buff,value'
retall
endif ; n_params(0) ne 2
buffsize = size(buff)
if ( (buffsize[0] ne 1) or (buffsize[1] ne 2) ) then begin
print,'decom_2s_complement: buff incorrect size'
retall
endif ; (buffsize[0] ne 1) or (buffsize[1] ne 2)
; used for calculation
two_array_16_2 = [ 1L, 2L, 4L, 8L, 16L, 32L, 64L, 128L, $
256L, 512L, 1024L, 2048L, 4096L, 8192L, 16384L, 32768L ]
; bytes to bits
temp = reverse(buff)
bitlis,temp,bit_array
; calculate value
; if (bit_array[15] eq 0) then $
; value = long(total(bit_array[0:14] * two_array_16_2[0:14])) $
; else $
; value = -1L * ( two_array_16_2[15] - $
; (long(total(bit_array[0:14] * two_array_16_2[0:14]))) )
value = ( -1L * two_array_16_2[15] * bit_array[15] ) + $
( long(total(bit_array[0:14] * two_array_16_2[0:14])) )
;stop
return
end ; decom_2s_complement