2.3.4.2. Función LSH

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

(lsh <integer> <num>)

LSH quiere decir Left-SHift, en inglés desplazamiento a la izquierda. Si se interpreta el número entero como una matriz de bits ("bit-array") podemos interpretar LSH como el desplazamiento de la matriz n-veces a la izquierda (insertando ceros a la 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 (suprimir el bit más a la derecha). (LSH i -1) es lo mismo que i/2 (ó i dividido 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. Con un desplazamiento de dos a la izquierda obtendríamos 0000 0100 que ya hemos visto que equivale a OSMODE CENtro y (lsh 1 2) devuelve el valor decimal de 4.

Con LSH podemos diseñar la función utilitaria siguiente, que nos 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 que corresponde a la posición de cualquier bit. Activar el bit 8 (referencia PERpendicular) 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 seguramente más claro en cuanto a la intención del programador. Debo advertir que la cosa no es tan sencilla, pues debemos primero haber comprobado que el bit 8 no estaba ya activado. Más adelante veremos cómo hacerlo valiéndonos de los operadores LOGAND y LOGIOR.

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

Como se puede ver, cuando se activa el bit 32 (en un sistema operativo de 32 bits) es decir, cuando la última posición a la izquierda de la palabra toma el valor de 1, su signo pasa a negativo y un nuevo desplazamiento a la izquierda devolvería de nuevo el valor del primer bit.
Esta propiedad nos permite definir una función para determinar la longitud 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 del próximo operador a estudiar, el NOT ló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