2.3.4.2. Función LSH

Para el cálculo del valor decimal de un determinado BIT seríamás adecuado, como veremos más adelante, utilizar lafunción LSH. Sgún la explicación de Reini Urban*:

(lsh <integer> <num>)

LSH quiere decir Left-SHift, eninglés desplazamiento a la izquierda. Si se interpreta el númeroentero como una matriz de bits ("bit-array") podemos interpretar LSHcomo el desplazamiento de la matriz n-veces a la izquierda (insertando ceros ala derecha)
Ejemplo:

int: 9 = 8+1 =>   (1 0 1) como "bit-array" (2^3 + 2^0)
(lsh 9 1) => (1 0 1 0) que es (2^4 + 2^1) = 18.

Fácil, puesto que (LSH i 1) es siempre igual a i*2
LSH con un número negativo es un desplazamiento a la derecha (suprimirel bit más a la derecha). (LSH i -1) es lo mismo que i/2 (ó idividido entre 2, "división de enteros")

De acuerdo con esto el valor decimal del primer BIT vendría dado por(lsh 1 0) equivalente a 0000 0001 y devolvería el valor decimal 1. Conun desplazamiento de dos a la izquierda obtendríamos 0000 0100 que yahemos visto que equivale a OSMODE CENtro y (lsh 1 2) devuelve el valor decimalde 4.

Con LSH podemos diseñar la función utilitaria siguiente, quenos devuelve el valor decimal de cualquier BIT:

(defun bit (posicion)
(lsh 1 (1- posicion))
)

De manera que (bit 1) devolvería 1, (bit 5) devolvería 16, etc.

Con lo que tenemos una manera sencilla de dar el valor decimal quecorresponde a la posición de cualquier bit. Activar el bit 8 (referenciaPERpendicular) significaría sumar (bit 8) al valor actual de OSMODE:

(setvar "osmode" (+ (getvar "osmode")(bit 8)))

Claro que sería lo mismo

(setvar "osmode" (+ (getvar "osmode") 128))

e incluso:

(setvar "osmode" (+ (getvar "osmode") (expt 2 8)))

Pero (bit 8) resulta más fácil de memorizar y seguramentemás claro en cuanto a la intención del programador. Debo advertirque la cosa no es tan sencilla, pues debemos primero haber comprobado que elbit 8 no estaba ya activado. Más adelante veremos cómo hacerlovaliéndonos de los operadores LOGAND y LOGIOR.

Pero si continuamos incrementando los valores que pasamos a lafunción BIT, descubriremos que hay un límite:

Como se puede ver, cuando se activa el bit 32 (en un sistema operativo de 32bits) es decir, cuando la última posición a la izquierda de lapalabra toma el valor de 1, su signo pasa a negativo y un nuevo desplazamientoa la izquierda devolvería de nuevo el valor del primer bit.
Esta propiedad nos permite definir una función para determinar lalongitud de palabra del sistema operativo actual:

(defun LongPalabra ( / pos)
(setq pos 0)
(while (not (minusp (lsh 1 pos)))
(setq pos (1+ pos))
)
(alert (strcat "Longitud de Palabra:\n\t" (itoa (1+ pos)) " Bits"))
)

En AutoCAD 2000 obtendríamos como resultado:

Es inportante tener esto en cuenta para comprender el funcionamiento delpróximo operador a estudiar, el NOTlógico binario (~ num).


* De: Reini Urban <rurban@sbox.tu-graz.ac.at>
Newsgroup: autodesk.autocad.customization
Asunto: Logand, logior, lsh, etc...
Fecha: Jueves, 03 Mar 1998 00:13:08 +0100
Traducción del inglés: Reinaldo Togores