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
| Inicio | Índice | Continuar... |
© 1999, Reinaldo Togores. Todos los derechos reservados.