Hay dieciséis operaciones lógicas básicas bitwise disponibles con 0, 1 o 2 entradas. (Las entradas cero constituyen los valores constantes 0 y 1). La 74LS181 ALU de 4 bits , utilizada en este clásico computadoras como la PDP-11, VAX 11/780 y muchas otras computadoras implementaron todas ellas. Estoy utilizando este chip como ejemplo porque su hoja de datos expone los circuitos internos y otros detalles de la ALU. Dicha información generalmente no está disponible para microprocesadores en la actualidad. Las dieciséis operaciones (enumeradas en el orden en que se abordan en el 74LS181) son:
~A NOT A
~(A&B) NAND
~A+B A IMPLY B can also be written ~(A & ~B)
1 constant 1
~(A+B) NOR
~B NOT B
~(A^B) XNOR
A+~B B IMPLY A can also be written ~(~A & B)
~A&B B NIMPLY A
A^B XOR
B B
A+B OR
0 constant 0
A&~B A NIMPLY B
A&B AND
A A
donde ~ = bit a bit NO, & = Y, | = O, y ^ = XOR como se usa en C y otros idiomas.
IMPLICAR y NIMPLY son instrucciones bastante especializadas que se utilizan principalmente en biología; ver por ejemplo este documento y también este . En hardware, se ven así:
No estoy seguro de si las ALU modernas proporcionan las dieciséis operaciones, ya que no hay forma de llegar a muchas de ellas a través de los conjuntos de instrucciones de sus procesadores.
Prácticamente todos los procesadores proporcionan las cuatro operaciones lógicas básicas a nivel de bits NOT, AND, OR y XOR en sus conjuntos de instrucciones a nivel de máquina, ya que todas las demás operaciones se pueden construir a partir de ellos, como se muestra en la tabla anterior.
Por lo tanto, un compilador que genera un código para la declaración de alto nivel:
C = A & ~B; // A NIMPLY B
podría generar algo como (utilizando un conjunto de instrucciones hipotéticas):
mov R0, A ; A => R0
mov R1, B ; B => R1
not R1 ; ~R1 => R1
and R0, R1 ; R0 & R1 => R0
mov C, R0 ; R0 => C
Ahora sería bueno que un compilador reconociera un patrón como C = A & ~ B pudo generar una instrucción para decirle a la ALU que realice el A & ~ Operación B en un ciclo (evitando tener que complementar B primero):
mov R0, A ; A => R0
mov R1, B ; B => R1
nimply R0, R1 ; R0 NIMPLY R1 => R0
mov C, R0 ; R0 => C
pero sin la instrucción de máquina para NIMPLY, no puede hacer esto. Sin embargo, al hacerlo solo se guarda una instrucción, ¿vale la pena?
Con la excepción de la familia 80x86, cuyo CISC (conjunto de instrucciones complejas) se remonta a casi 40 años (1978), la mayoría de los procesadores de hoy usan alguna versión de RISC (conjunto de instrucciones reducido). Por lo tanto, las instrucciones especializadas y poco utilizadas como IMPLY y NIMPLY no tienen lugar en los procesadores RISC.