OPERADORES UNARIOS
El not no es el único operador de bits que toma sólo un argumento. Su compañero, el not lógico (!), toma un valor true y produce un valor false. El menos unario (-) y el más unario (+) son los mismos operadores que los binarios menos y más; el compilador deduce que uso se le pretende dar por el modo en el que se escribe la expresión.
De hecho, la sentencia:
x = -a;
tiene un significado obvio.
El compilador puede deducir:
x = a * -b;
pero el lector se puede confundir, de modo que es más seguro escribir
:
x = a * (-b);
x = a * (-b);
El menos unario produce el valor negativo.El más unario ofrece simetría con el menos unario, aunque en realidad no hace nada.
Los operadores de incremento y decremento (++ y --) se comentaron ya en este capítulo. Son los únicos operadores, además de los que involucran asignación, que tienen efectos colaterales. Estos operadores incrementan o decrementan la variable en una unidad, aunque «unidad» puede tener diferentes significados dependiendo del tipo de dato - esto es especialmente importante en el caso de los punteros.
Los últimos operadores unarios son dirección-de (&), indirección (* y ->), los operadores de moldeado en C y C++, y new y delete en C++.
OPERADORES BINARIOS
Operador a nivel de bits
Se define como operación binaria un procedimiento entre dos o más variables en base 2 (o también llamado en módulo 2). Desde el punto de vista de la informática, estas operaciones, aunque son puramente matemáticas, ocupan un gran rol en el funcionamiento de la computadora. Esta es la razón por la que se encuentran muchas veces en los microprocesadores y más específicamente en las ALU (Unidades Aritmético Lógicas).
Tipos de operaciones
1. Operaciones Lógicas: Evalúan el resultado de una expresión, dando verdadero o falso.
2. Operaciones Aritméticas: Realizan alguna de las siguientes operaciones: suma, resta, multiplicación y división
3. Operaciones Comparativas: Evalúan una doble operación lógica sobre una variable o expresión para determinar si es mayor, menor ó igual a dicho operando
4. Operaciones de Desplazamiento: Conocidos como «shifts» consisten en alterar el orden de los bits de un registro.
5. Operaciones de Rotación: similares a los shifts pero aprovechando características del procesador (para rotar los bits en un registro).
- Operación Lógica
Una operación lógica evalúa 2 o más operandos mediante uno de los operadores lógicos (OR, AND, XOR,NAND ó NOR). El operador NOT sólo se aplica a un operando o expresión. Las operaciones lógicas sirven para tomar decisiones y en su forma más compleja realizan comparaciones. También son llamadas Operaciones Booleanas en mención al Álgebra de Boole, estas son usualmente: En los lenguajes de programación algunas operaciones no están implementadas toda vez que se consigue al aplicar 2 de ellas. Estas operaciones son típicamente NAND' y NOR que se consiguen mediante AND y OR y después se les aplica una operación NOT.
A nivel de hardware, por cuestiones de rendimiento y espacio pueden o no implementarse cada una de ellas ó sólo AND, OR y NOT, lo cual depende del diseño.
A nivel de hardware existen circuitos lógicos que representan cada una de las operaciones como puertas lógicas. E igualmente existen bloques compuestos únicamente de un tipo determinado de ellos. Al hardware diseñado con estos bloques se les denomina circuitos combinacionales. Los primeros ordenadores se construyeron de este modo.
- Operación Aritmética
Las operaciones aritméticas permiten manejar los datos para producir resultados de expresiones. Varios circuitos se fabrican y diseñan para tales propósitos, los más típicos son los de: suma, resta, multiplicación y división otros menos conocidos pero menos frecuentes son el resultado de uno o más de ellos, por ejemplo los contadores, el circuito contador es básicamente un circuito cuya operación principal es la suma, con la particularidad de que al llegar al tope deseado, retorna al valor inicial. Por ejemplo un contador sexagesimal debe volver a valer 00 después de alcanzar el valor 59 (una aplicación típica son los relojes, en las funciones de minutos y horas).
Todo programa necesita hacer infinidad de operaciones de cálculo, que se efectúan con tales operaciones. A nivel de hardware, las operaciones de suma se llevan a cabo con el mismo circuito de suma ligeramente modificado. Las operaciones aritméticas a su vez están compuestas de operaciones lógicas.
- Operación Comparativa
Las operaciones de comparación pueden entenderse como operaciones lógicas de mayor complejidad, y normalmente diseñadas y establecidas para la interacción humana. Dadas dos variables me permite conocer si una de ellas es mayor, menor o igual a la otra. El mecanismo utilizado internamente es la resta de las dos variables. A partir de esta operación y, basándose en el estado final de los flags, se determina cómo es la relación entre las dos variables. Hay otras comparaciones posibles, como saber si un valor es par o impar.
Las operaciones de comparación son una forma más elevada de tomar decisiones ya que puede aglutinar complejas expresiones que las utilizadas por simples operaciones lógicas.
En los lenguajes de alto nivel, las comparaciones suelen usarse en los mecanismos de decisión, como son la bifurcación y la ejecución de bucles.
Operación de Desplazamiento
Suma binaria
La suma binaria se puede realizar cómodamente siguiendo las tres reglas descritas:
1. Si el número de unos (en sentido vertical) es par el resultado es 0.
2. Si el número de unos (en sentido vertical) es impar el resultado es 1.
3. Acarreo tantos unos como parejas (completas) de números 1 haya.
Por ejemplo:
0 + 0 = 0,
0 + 1 = 1,
1 + 0 = 1,
1 + 1 = 0 se pone 0 y se acarrea un 1 a la posición siguiente.
Para sumar 1010 (que en decimal es 10) y 1111 (que en decimal es 15). 10 + 15 = 25

Resta binaria
Las cuatro reglas básicas para la resta de números binarios son:
0 - 0 = 0
1 – 1 = 0
1 – 0 = 1
0 – 1 = 1 ( con acarreo negativo de 1)
Al restarse números algunas veces se genera un acarreo negativo que pasa a la siguiente columna de la izquierda. En binario solo se produce este acarreo cuando se intenta restar 1 de 0 (4ª regla).
Ejemplo sobre esta situación, restar 011 de 101:
101 – 011 = 010
Multiplicación binaria
La multiplicación binaria es tan sencilla como la decimal, y es que funcionan de la misma manera. Aquí tienen un ejemplo de multiplicación binaria. Supongamos que multipliquemos 10110 por 1001:

Vamos multiplicando por cada dígito de 1001 el conjunto 10110 y luego procedemos a hacer la suma. Hay otro tipo de procedimientos para realizar esta multiplicación sin signo y es el llamado "Multiplicación por el método de Suma-Desplazamiento
División binaria
Reglas de la división binaria: 0/0 no permitida, 1/0 no permitida,0/1=0, 1/1=1 .
• División: Se hace igual como el sistema decimal.
Ejemplo de división binaria: En este ejemplo dividiremos 101101 entre 111:

hay que comenzar cogiendo 4 cifras del dividendo para sobrepasar al divisor. Así resulta que 1011 entre 111 toca a 1 (solo puede ser 1 o 0):
1 por 111 es 111:

y falta 100 hasta llegar a 1011:
Bajando la siguiente cifra (un 0) resulta que 1000 entre 111 toca a 1.
Así sucesivamente.

Como operación digital
Exactamente igual que la operación binaria no digital, salvo que cambia la suma "1 + 1 = 0 y acarreo 1" por 1+1=1. Es decir, que en la suma digital no se acarrea ninguna cifra. Por lo demás, es igual que la suma binaria.
Como operación de un subsistema de ejecución
Hay muchos tipos más para tratar convenientemente la información en un sistema microprocesador, tales como manejo de variables de cadenas, movimientos de datos entre secciones físicas etc. Para una mayor profundidad en detalles sobre el tema, ver juego básico de instrucciones de un sistema microprocesador o juego de instrucciones de un microprocesador determinado.
Como proceso de datos numéricos
• Debe tenerse en consideración que esta clasificación es una aproximación para afrontar el tema con cierto orden, basado en el registro enciclopédico, ya que estrictamente unos campos entran en otros, y resulta imposible separar de modo absoluto cada uno de ellos, considerando esta, una clasificación plenamente aceptable.
Conjunción lógica
En matemáticas , una conjunción lógica (comúnmente conocida como Y, ó ) es un operador lógico que resulta en verdadero si los dos operadores son verdadero.
Definición
En lógica y matemáticas una conjunción es un "enunciado con dos o más elementos simultáneos". Una lampara eléctrica se enciende si hay corriente eléctrica, el interruptor esta conectado, el fusible esta bien y la lampara no esta fundida, en cualquier otro caso la lampara no se encenderá.
Para dos entradas A y B, la tabla de verdad de la función conjunción es:

Símbolo

El símbolo matemático para la conjuncion lógica varia en la literatura. Además de utilizar "Y", el símbolo en forma de es comúnmente utilizado para la conjunción. Por ejemplo:
se lee como "A y B". Esta Conjunción es cierta si ambas A y B son ciertas a la vez. En todos los demás casos es falsa.
La noción equivalente en teoría de conjuntos es la Intersección de conjuntos. Y el símbolo representativo es "y" y
Operación con bits

La conjunción es utilizada a menudo para operaciones con bits. Por ejemplo:
• Cero y cero:

• Cero y uno:

• Uno y cero:

• Uno y uno:

• Para cuatro bit:
Disyunción lógica
En matemáticas, una disyunción lógica (comúnmente conocida como O, ó ) es un operador lógico que resulta en verdadero si cualquiera de los operadores es verdadero.
Definición
En lógica y matemáticas una disyunción es un "enunciado con dos o más elementos optativos". Por ejemplo "Puedes leer este artículo o editarlo", es una disyunción con dos elementos, mientras que "Puedes leer este artículo, imprimirlo o editarlo" es una disyunción con tres elementos.
Nótese que en el lenguaje cotidiano el uso de la palabra "o" significa a veces "alguno, pero sólo uno", por ejemplo: "¿Vas a ir mañana a México o a España?". En lógica, a esto se le llama "disyunción exclusiva" u "o exclusivo". Cuando se utiliza formalmente, "o", permite que uno o más de los elementos de la disyunción sean válidos, por lo cuál "o" es también llamado "disyunción inclusiva" Plantilla:Rf.
Para dos entradas A y B, la tabla de verdad de la función disyuntiva es: también la disyucción, , es cuando hay dos elementos en dos conjuntos que forman una propocicion:
Más generalmente la disyunción es una fórmula lógica que puede tener una o más literales separadas con "o". Una sola literal se considera una disyunción degenerada.
Símbolo
El símbolo matemático para la disyunción lógica varia en la literatura. Además de utilizar "o", el símbolo en forma de "v" ("?") es comúnmente utilizado para la disyunción. Por ejemplo: "A ? B" se lee como "A o B". Esta disyunción es falsa si ambas A y B son falsas a la vez. En todos los demás casos es verdadera.
Todas las expresiones siguientes son disyunciones:
A ? B
¬A ? B
A ? ¬B ? ¬C ? D ? ¬E
La noción equivalente en teoría de conjuntos es la unión. Y el símbolo representativo es "O" y "V"
Asociatividad y Conmutatividad
Para más de dos elementos de entrada o puede ser aplicada a los primeros dos, y el resultado obtenido operado con o al siguiente elemento y así sucesivamente:
(A o (B o C)) ? ((A o B) o C)
Debido a que o es asociativo, el orden de las entradas no importa: el mismo resultado se obtiene sin importar la asociación que se haga.
El operador xor es también conmutativo y por consiguiente el orden de los operandos no importa:
A or B ? B or A
Operación con bits
La disyunción es utilizada a menudo para operaciones con bits. Por ejemplo:
• Cero ó cero:
• Cero ó uno:
• Uno ó cero:
• Uno ó uno:
• Para cuatro bit:
Nótese que en ciencias computacionales el operador o puede ser utilizado para llevar un bit a 1 aplicando una operación o entre el bit y un 1.
Unión
La unión utilizada en teoría de conjuntos se define en términos de la disyunción lógica: x ? A ? B si y solo si (x ? A) ? (x ? B). Debido a esto, la disyunción lógica satisface muchas de las mismas identidades que la unión de la teoría de conjuntos, como la asociatividad, conmutatividad, distributividad y las Leyes de De Morgan.
Negación lógica
En lógica y matemática, la negación, también llamada complemento lógico, es una operación sobre proposiciones, valores de verdad, o en general, valores semánticos. Intuitivamente, la negación de una proposición es verdadera cuando dicha proposición es falsa, y viceversa. En lógica clásica la negación está normalmente identificada con la función de verdad que cambia su valor de verdadero a falsity y viceversa. En Lógica intuicionista, de acuerdo a la interpretación BHK, la negación de una proposiciónp es la proposición cuyas pruebas con las refutaciones de p. En la semántica de Kripke, donde los valores semánticos de las fórmulas son conjuntos de posibles mundos, la negación de p, es su complemento.
Definición
La negación clásica es una operación sobre un valor de verdad, típicamente, el valor de una proposición, que produce un valor de verdadero cuando su operando es falso, y un valor de falso cuando su operando es verdadero. Por tanto, si el enunciado A es verdadero, entonces ¬A (pronunciado "no A") sería consecuentemente falso; y lo contrario, si ¬A es verdadero, entonces A sería falso.
La tabla de verdad de ¬p es la siguiente:
Tabla de verdad de ¬p
p ¬p
Verdadero Falso
Falso Verdadero
La genación clásica se puede definir en términos de otras operaciones lógicas. Por ejemplo, ¬p se puede definir como p ? F, donde "?" es una implicación lógica y F es una falsedad absoluta. Por el contrario, se puede definir F como p & ¬p para cualquier proposición p, donde "&" es una conjunción lógica. La idea aquí es que cualquier contradicción es falsa. Mientras estas ideas funcionan tanto en la lógica clásica como en la instuicionista, no funcionan en la [lógica paraconsistente]], donde las contradicciones no son necesariamente falsas.
En lógica clásica tenemos una identidad adicional: p ? q se puede definir como ¬p ? q, donde "?" es la disyunción lógica: "no p, o q".
Algebraicamente, la negación clásica corresponde con el complemento en un álgebra booleana, y la negación intuicionista al seudocomplemento en un álgebra de Heyting. Estas álgebras proveen una semántica para las lógicas clásica e intuicionista respectivamente.
Notación
La negación de una proposición p se denota dediferentes maneras en varios contextos de discisión y campos de aplicación. Entre estas variantes, tenemos las siguientes:
Notación Vocalización
¬p no p
-p no p
~p no p
Np ene p
p prima ,
complemento de p
p barra,
barra p
exclamación p
Independientemente de la notación o símbolo utilizados, la negación ¬p / ~p se puede leer como "no es el caso que p", "no es cierto que p", o por lo común, simplemente (aunque no gramaticalmente) como "no p".
Propiedades
Doble negación
Dentro de un sistema de lógica clásica, la doble negación, esto es, la negación de la negación de una proposición p, es lógicamente equivalente a p. Expresado simbólicamente, ¬(¬p) ? p. En lógica intuicionista, una proposición implica su doble negación, pero no al revés. Esto marca una importante diferencias entre las genaciones clásica e intuicionista. Algebraicamente, la negación clásica es llamada una involución de periodo dos.
Sim embargo, en lógica intuicionista, sí tenemos la equivalencia entre ¬¬¬p y ¬p. Es más, en el caso proposicional, una oración es demostrable de forma clásica, si su doble negación es demostrable de manera intuicionista. Este resultado es conocido como el teorema de Glivenko.
Dentro de un sistema de lógica clásica, la doble negación, esto es, la negación de la negación de una proposición p, es lógicamente equivalente a p. Expresado simbólicamente, ¬(¬p) ? p. En lógica intuicionista, una proposición implica su doble negación, pero no al revés. Esto marca una importante diferencias entre las genaciones clásica e intuicionista. Algebraicamente, la negación clásica es llamada una involución de periodo dos.
Sim embargo, en lógica intuicionista, sí tenemos la equivalencia entre ¬¬¬p y ¬p. Es más, en el caso proposicional, una oración es demostrable de forma clásica, si su doble negación es demostrable de manera intuicionista. Este resultado es conocido como el teorema de Glivenko.
Linealidad
En el álgebra de Boole, una función lineal es una función tal que:
Si existe a0, a1, ... , an {0,1} tal que f(b1, ... , bn) = a0 ? (a1 b1) ? ... ? (an bn), para todo b1, ... , bn {0,1}.
Otra forma de expresar esto es que cada variable siempre cambia su valor de verdad de la operación o nunca cambia. La negación es un operador lógico lineal.
En el álgebra de Boole, una función lineal es una función tal que:
Si existe a0, a1, ... , an {0,1} tal que f(b1, ... , bn) = a0 ? (a1 b1) ? ... ? (an bn), para todo b1, ... , bn {0,1}.
Otra forma de expresar esto es que cada variable siempre cambia su valor de verdad de la operación o nunca cambia. La negación es un operador lógico lineal.
Autodualidad
En el álgebra de Boole, una función autodual es una función tal que:
Si f(a1, ... , an) = ~f(~a1, ... , ~an) para todo a1, ... , an {0,1}. La negación es un operador lógico de autodualidad.
Si f(a1, ... , an) = ~f(~a1, ... , ~an) para todo a1, ... , an {0,1}. La negación es un operador lógico de autodualidad.
Reglas de inferencia
Hay varias formas equivalentes entre sí, de formular reglas para la negación. Una forma usual de formular la negación clásica, al establecer una deducción natural, es tomar como reglas primitivas de inferencia:
• Introducción de la negación (Si p implica a q y ¬q, inferimos ¬p; esta regla también se llama reductio ad absurdum),
Hay varias formas equivalentes entre sí, de formular reglas para la negación. Una forma usual de formular la negación clásica, al establecer una deducción natural, es tomar como reglas primitivas de inferencia:
• Introducción de la negación (Si p implica a q y ¬q, inferimos ¬p; esta regla también se llama reductio ad absurdum),
• Eliminación de la negación (Dado p y ¬p inferimos q; esta regla también se llama ex falso quodlibet),
• Eliminación de la doble negación (Dado ¬¬p inferimos p).
Las reglas para negación intuicionista se obtienen de la misma forma, pero excluyendo la eliminación de la doble negación.
La introducción de la negación establece que si se puede obtener un absurdo como conclusión de p, entonces p no debe ser el caso (p es falso (clásico), o refutable (intuicionista), etc.). La eliminación de la negación establece que cualquier cosa se desprende de un absurdo. A veces, la negación de la elimincación es formulada usando el signo primitivo de absurdo ?. En este caso, la regla dice que dado p y ¬p concluimos en un absurdity. Junto a la eliminación de la doble negación, se puede inferir la regla originalmente formulada, a saber, que cualquier cosa que se desprende de un absurdo.
Típicamente, la negación intuicionista ¬p de p se define como p??. Entonces la introducción de la negación y la eliminación son sólo casos especiales de introducción de la implicación (prueba condicional) y eliminación (modus ponens). En este caso, podemos también agregar como regla primitiva ex falso quodlibet.
Programación
Así como en matemática, la negación es ampliamente usada en computación para construir expresiones lógicas.
if (!(r == t))
{
/*...sentencias ejecutadas cuando r NO ES IGUAL a t...*/
}
Así como en matemática, la negación es ampliamente usada en computación para construir expresiones lógicas.
if (!(r == t))
{
/*...sentencias ejecutadas cuando r NO ES IGUAL a t...*/
}
El signo "!" significa NO lógico en B, C, y otros lenguajes inspirados en la sitaxis de C como C++, Java, Perl, PHP, etc. "NOT" es el operador usado en ALGOL 60, BASIC, COBOL, y lenguanes inspirados en la sintaxis de ALGOL como Pascal, Ada, Seed7, etc. Algunos lenguajes (C++, Perl, etc.) proveen más de un operador para la negación. Algunos lenguajes como PL/I y Ratfor, usan ¬ para la negación. Algunas computadoras y sistemas operativos modernos muestran ¬ como ! en archivos condificados en ASCII.
Existe también la negación a nivel de bits. Ésta toma el valor dado, y cambia todo el binario; los 1 cambian a 0 y los 0 a 1. Esta operación es usada normalmente para generar el complemento a uno o "~" en C o C++ y el complemento a dos (sólo simplificado a "-" o el signo negativo ya que esto es equivalente a tomar el valor aritmético negativo del número) ya que básicamente genera el opuesto (valor negativo equivalente) o complemento matemático del valor (donde ambos valores se agregan juntos para crear un todo).
Para obtener el valor absoluto (equivalente positivo) de un entero dado, el siguiente código trabajaría cambiando el signo de negativo a positivo (es negativo porque "x < 0" resulta verdadero)
unsigned int abs(int x)
{
if (x < 0)
return -x;
else
return x;
}
Para demostrar la negación lógica:
unsigned int abs(int x)
{
if (!(x < 0))
return x;
else
return -x;
}
Invirtiendo la condición y revirtiendo las salidas, se genera código que es lógicamente equivalente al código original, es decir, que obtendremos idénticos resultados para cualquier entrada. (Nota: Dependiendo del compilador utilizado, las instrucciones reales ejecutadas por la computadora pueden diferir).
unsigned int abs(int x)
{
if (x < 0)
return -x;
else
return x;
}
Para demostrar la negación lógica:
unsigned int abs(int x)
{
if (!(x < 0))
return x;
else
return -x;
}
Invirtiendo la condición y revirtiendo las salidas, se genera código que es lógicamente equivalente al código original, es decir, que obtendremos idénticos resultados para cualquier entrada. (Nota: Dependiendo del compilador utilizado, las instrucciones reales ejecutadas por la computadora pueden diferir).
No hay comentarios:
Publicar un comentario