2.3.4.4. Función LOGAND

Para LOGAND transcribimos la explicación de Jon Fleming * en el mismo hilo de discusión donde fué expuesta la explicación anterior de Reini Urban:

(logand 13 22) es el AND lógico de [8 + 4 + 1] con [16 + 4 + 2] o, escribiendo los números en binario, de 00001101 con 00010110.

Escribiendo los números uno sobre el otro, podemos entonces escribir la respuesta en binario de inmediato, escribiendo un 1 bajo dos números uno y un 0 en cualquier otro lugar:

 
13 = 00001101
22 = 00010110
13 y 22 = 00000100

es decir, 4 en notación decimal. Por lo tanto, (logand 13 22) devuelve 4. El AND lógico se suele utilizar como filtro. Uno de los números que definimos contendrá un 1 en su representación binaria dondequiera que deseamos que un posible 1 en un número desconocido pase por el filtro. Esto se debe a que un entero es un lugar muy eficiente para guardar varios valores lógicos verdadero/falso relacionados como unos y ceros en posiciones definidas en la representación binaria de un entero.

Un ejemplo perfecto lo constituye la variable de sistema OSMODE. ¿Queremos saber si la referencia a objeto INTERSECCIÓN se encuentra activa? Nuestra referencia de comandos nos dice que la presencia de 32 en el valor de OSMODE indica la referencia INTERSECCIÓN. Como sólo nos interesa la referencia INTERSECCIÓN, escribimos la representación binaria de OSMODE con "x" en las posiciones que no interesa comprobar: El valor de OSMODE podría ser:

   xxxxxx1xxxxx 
o: xxxxxx0xxxxx

Así que si pasamos a (logand ...) cualquiera de esos valores con 0000 0010 0000 que es 32 en base 10, obtenemos, ya sea 32 (si está activa la referencia INTERSECCIÓN) o 0 (cero) si no lo está. En otras palabras:

(if (logand 32 (getvar "OSMODE"))
(prompt "\nLa referencia INTERSECCIÓN está ACTIVA")
(prompt "\nLa referencia INTERSECCIÓN NO está ACTIVA")
)

Utilizando las funciones LSH, ~ y LOGAND pudiéramos desarrollar funciones para la conversión de decimales en binarios y viceversa, útiles al menos para comprender mejor la operación de estas funciones binarias. Este será el tema de la próxima sección.

Los ejemplos de LOGAND en los programas LISP que vienen con AutoCAD sí son numerosos. Podemos enumerar para la versión 14: BMAKE.LSP, DDATTDEF.LSP, DDGRIPS.LSP, ATTREDEF.LSP, DDCHPROP.LSP, DDCOLOR.LSP, DDINSERT.LSP, DDMODIFY.LSP, DDPTYPE.LSP, DDSELECT.LSP, DDUNITS.LSP, DDVIEW.LSP, 3D.LSP, EDGE.LSP, MVSETUP.LSP, BLK_LST.LSP, COUNT.LSP, LMAN.LSP, TREXBLK.LSP, CLIPIT.LSP, EXCHPROP.LSP, EXTRIM.LSP, XPLODE.LSP, CURSDLG.LSP, SQLEDDLG.LSP.
Mucchos de estos programas ya aparecían en la versión 13. Para indicar alguno de aquella versión que ha desaparecido desde entonces podemos mencionar DDOSNAP.LSP. Enumerando sólo algunos de la versión 12 tendríamos: CHELEV.LSP, MAKE2D.LSP, MAKE3D.LSP, PTEXT.LSP, CL.LSP y PROJECT.LSP, y de la versión 10 TABLES.LSP, lo que nos puede dar una idea de lo útil que resulta esta función.


* De: Jon Fleming <jonf@fleming-group.com>
Newsgroup: autodesk.autocad.customization
Asunto: Logand, logior, lsh, etc...
Fecha: Jueves, 26 Feb 1998 20:35:37 EST
Organización: The Fleming Group
Traducción del inglés: Reinaldo Togores