|
| Volver a índice |
Los operadores de Java son caracteres especiales que le
dicen al compilador que se desea realizar una operación
sobre algunos operandos. A los operadores que toman un
único operando se les llama operadores unarios. A los que
aparecen antes del operando se les llama operadores prefijo
y los que van después se les llama operadores sufijo. La
mayoría de los operadores están entre dos operandos y se
les llama operadores binarios infijo. E incluso hay un
operador que toma tres operandos y se le llama operador
ternario.
Java tiene 44 operadores incorporados divididos en cuatro
clases básicas: aritméticos, a nivel de bit, relaciónales y
lógicos.
Los operadores aritméticos se utilizan para operaciones matemáticas, exactamente de la misma manera en la que están definidos en álgebra. Los operandos deben ser tipo numérico. No se pueden utilizar estos operadores con tipos boolean, pero se pueden utilizar con tipos char, dado que el tipo char en Java es un subconjunto de int.
La suma, reta, multiplicación y división se comporta todas como se espera de todos los tipos numéricos. El operador menos unario niega al operando único al que precede.
El operador módulo, %, devuelve el resto de una división. En Java la función módulo funciona con tipos en coma flotante además de con tipos enteros.
Asignaciones con operadores aritméticos
Cada uno de los operadores aritméticos tiene una forma asociada, cuando se tiene una asignación tras la operación. Esto sirve para todos los operaciones que se utilizan de la siguiente forma
var = var op expresión;
que, por lo tanto, se puede reescribir como
var op= expresión;
Aquí tenemos algunos ejemplos que muestran varias asignaciones y sus correspondientes con el operador op=.
a = a + 4; también se puede utilizar a += 4;
a = a % 2; se puede expresar como a %=2;
Los operadores incremento y decremento (++ y --) son una notación abreviada para aņadir o restar 1 de un operando. La forma completa es
x = x + 1; que como se ha mostrado anteriormente, es lo mismo que
x += 1; que, utilizando este nuevo operador, es igual a
++x;
del mismo modo x = x -1 equivale a --x
Estos operadores pueden aparecer en forma de prefijo, como lo mostrado hasta ahora, y también en forma de sufijo cuando siguen al operando. La diferencia entre las dos formas es importante. En la forma de prefijo, el operando se modifica antes de obtener el valor. En la forma sufijo, se obtiene el valor, y a continuación el operando se incrementa o decrementa. Por ejemplo:
x = 42;
y = ++x; en este caso, y se establece a 43; sin embargo:
x = 42;
y = x++; se toma el valor de x antes del incremento;
y se establece a 42, y x a 43.
Operadores a nivel de bit enteros
Los tipos numéricos enteros, long, int, short, char y byte tienen un conjunto adicional de operadores que pueden modificar e inspeccionar los bits que componen sus valores. Estos operadores se resumen a continuación.
Todos los tipos enteros se representan mediante números binarios de anchura variable. Por ejemplo, el valor de byte de 42 en binario es 00101010. Los operadores a nivel de bit operan independientemente sobre cada uno de los bits de un valor.
NOT
El operador NOT unario, ~, invierte todos los bits de su operando. Por ejemplo, en número 42, que tiene el siguiente patrón de bits 00101010 se convierte en 11010101 después de aplicar el operador NOT.
AND
El operador AND, &, combina los bits de manera que se obtiene un 1 si ambos operandos son 1, obteniendo 0 en cualquier otro caso.
00101010 42
& 00001111 15
= 00001010 10
OR
El operador OR, |, combina los bits de manera que se obtiene un 1 si cualquiera de los operandos es un 1.
00101010 42
| 00001111 15
= 00101111 47
XOR
El operador XOR, ^, combina los bits de manera que se obtiene un 1 si cualquiera de los operandos es un 1, pero no ambos, y cero en caso contrario.
00101010 42
^ 00001111 15
= 00100101 37
La tabla siguiente muestra cómo actúa cada operador a nivel de bit sobre cada combinación de bits de operando.
| A | B | OR | AND | XOR | NOT |
| 0 | 0 | 0 | 0 | 0 | 1 |
| 1 | 0 | 1 | 0 | 1 | 1 |
| 0 | 1 | 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 | 0 |
El operador desplazamiento a la izquierda, <<, mueve hacia la izquierda todos los bits del operando de la izquierda un número de posiciones de bit especificado en el operando de la derecha. Al realizarse el desplazamiento se pierden por el extremo izquierdo del operando el número de bits desplazados y se rellena el operando con ceros por la derecha el mismo número de bits.
El operador desplazamiento a la derecha, >>, mueve hacia la derecha todos los bits del operando de la izquierda un número de posiciones de bit especificado por el operando de la derecha. Este ejemplo desplaza el valor 32 a la derecha dos posiciones de bit, obteniendo como resultado que el valor de a sea 8.
int a = 32;
a = a >> 2;
Cuando un valor tiene bits que se desplazan fuera por la parte izquierda o derecha de una palabra, esos bits se pierden. Este ejemplo desplaza el valor 35 a la derecha los dos bits inferiores por la derecha, y el resultado vuelve a ser que el valor de a sea 8.
int a = 35;
a = a >> 2;
Si se estudian en binario estas operaciones se observa con mayor claridad.
00100000 32 00100011 35
>> 2 >> 2
00001000 8 00001000 8
Desplazamiento a la derecha sin signo
El operador de desplazamiento a la derecha rellenando con ceros de Java, >>>, desplaza introduciendo ceros en los bits más significativos, a lo que se llama desplazamiento sin signo. En este ejemplo, a se establece a -1, lo que supone en binario que los 32 bits sean 1. Este valor se desplaza después a la derecha 24 bits, rellenando los 24 bits superiores con ceros, ignorando la extensión de signo normal, a pasa a valer 255.
int a = -1;
a = a >>> 24;
Esta misma operación en formato binario:
11111111111111111111111111111111 -1
>>> 24
00000000000000000000000011111111 255
Esto es especialmente útil en la creación de máscaras para operaciones gráficas.
Todos los operadores a nivel de bit binarios tienen una forma similar a la de los operadores algebraicos, que hacen una asignación automática del resultado al operador de la izquierda. Por ejemplo:
a = a >> 4; equivale a: a >>= 4; desplazan el valor de a cuatro posiciones
a = a | b; equivale a: a |= b; se asigna a a el resultado de a OR b.
Para comparar dos valores, Java tiene el siguiente conjunto de operadores relaciónales que describen igualdad y ordenamiento.
| Operador | Resultado |
| = = | igual a |
| != | distinto de |
| > | mayor que |
| < | menor que |
| >= | mayor o igual que |
| <= | menor o igual que |
Sólo se pueden comparar los tipos numéricos utilizando los operadores de ordenación. Se pueden comparar operandos enteros, en coma flotante y caracteres para ver cual es mayor o menor que otro. Cada uno de los operadores devuelve como resultado un tipo boolean.
Todos los operadores lógicos booleanos combinan dos valores boolean para dar como resultado un valor boolean.
| Operador | Resultado | Operador | Resultado |
| & | AND lógico | &= | Asignación AND |
| | | OR lógico | |= | Asignación OR |
| ^ | XOR lógico (OR exclusivo) | ^= | Asignación XOR |
| || | OR en cortocircuito | = = | igual a |
| && | AND en cortocircuito | != | distinto de |
| ! | NOT unario lógico | ?: | if-then-else ternario |
Los operadores booleanos lógicos, AND, OR, XOR operan sobre valores booleanos de la misma manera que operaban sobre los bits de un entero. El operador lógico NOT invierte el estado booleano.
| A | B | OR | AND | XOR | NOT |
| false | false | false | false | false | true |
| true | false | true | false | true | false |
| false | true | true | false | true | true |
| true | true | true | true | false | false |
Operadores lógicos en cortocircuito
Existen versiones secundarias de los operadores lógicos AND y OR, a los que se llama operadores lógicos en cortocircuito. La utilización de estos operadores en una expresión provoca que la evaluación se detenga inmediatamente en el momento en que se conoce el resultado de la expresión que se está evaluando. Así, por ejemplo, este fragmento de código muestra la manera de aprovechar la evaluación lógica en cortocircuito para asegurarse que una operación de división es válida antes de evaluarla.
if (denom != 0 && num / denom > 10)
Dado que se utilizó la forma en cortocircuito de AND, &&, no se corre el riesgo de provocar una excepción (error) en tiempo de ejecución al intentar dividir por denom cuando éste fuese igual a cero
Operador if-then-else ternario
Java incluye el mismo operador ternario que C y C++. La forma general es
expresión ? sentencia1 : sentencia2
Donde expresión puede ser cualquier expresión que dé como resultado un valor boolean. Si el resultado es true entonces se ejecuta sentencia1, en caso contrario se ejecuta sentencia2. La limitación es que sentencia1 y sentencia2 deben devolver el mismo tipo, que no puede ser void.
La tabla siguiente muestra el orden de todas las posibles operaciones en Java, desde la precedencia más alta a la más baja.
| La más alta | |||
| ( ) | [ ] | . | |
| ++ | -- | ~ | ! |
| * | / | % | |
| + | - | ||
| >> | >>> | << | |
| > | >= | < | <= |
| == | != | ||
| & | |||
| ^ | |||
| | | |||
| && | |||
| | | | |||
| ? : | |||
| = | op= | ||
| La más baja |
Dado que los paréntesis son la precedencia más alta,
siempre puede poner una pareja de paréntesis extra si no se
está seguro de las reglas de precedencia implícitas o
quiere que su código sea legible. En expresiones
complicadas, incluso si se está seguro de la precedencia,
pueden ayudar al programador unos paréntesis
clarificadores.
Por ejemplo, si no está seguro de lo que significa la
siguiente expresión,
a | 4 + c >> b & 7 || b > a % 3
intente poner unos cuantos paréntesis que la aclaren, por ejemplo:
(a | (((4 + c) >> b) & 7)) || (b > (a % 3))