[icono]Manual de Java Volver a índice

Capítulo 2. Operadores.


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.

Operadores aritméticos

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.

Operadores de calculadora

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.

Operador módulo

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;

Incremento y decremento

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

Desplazamiento a la izquierda

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.

Desplazamiento a la derecha

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.

Operadores relacionales

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.

Operadores lógicos booleanos

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.

Precedencia de operadores

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

Precedencia explícita

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))