Operadores de Java Bitwise: listado y funciones

Los operadores de Java bit a bit, también conocidos como operadores Bitwise, permiten manipular bits individuales según se requiera. En total, hay siete operadores, todos con una estructura muy parecida. Además, las reglas que siguen son muy fáciles de entender.

¿Qué son los operadores de Java Bitwise y para qué se utilizan?

Los operadores de Java son una herramienta muy importante si estás trabajando con el lenguaje de programación. Entre ellos, se encuentran los operadores de Java Bitwise, que te permiten manipular bits. Si deseas consultar valores binarios bit a bit, necesitas un operador Bitwise. Puedes aplicarlo a los tipos de datos enteros (byte, char, int, short, long).

Aunque no vas a necesitar estos operadores a diario, su utilidad se pondrá de manifiesto en determinadas situaciones: por ejemplo, si quieres ahorrar espacio al convertir datos, si deseas utilizar el operador XOR o si deseas cambiar un solo bit. Además, los operadores a nivel de bit tienen un gran peso en las operaciones de circuitos más complejos. Por todo ello, merece la pena entender el funcionamiento de estos operadores.

Hosting
El hosting como nunca lo habías visto
  • Rápido, seguro, flexible y escalable
  • Certificado SSL/DDoS incluido
  • Dominio y asesor personal incluidos

¿Qué operadores Bitwise de Java existen?

Hay un total de siete operadores Bitwise diferentes en Java. Para poder entenderlos mejor, se trabaja con los operandos “a” y “b”.

  • ~ (complemento o “Bitwise not”): este operador invierte cada bit. Es decir, un 0 se convierte en un 1 y un 1 se convierte en un 0.
  • & (“Bitwise and”): este operador da como resultado un 1 si ambos operandos son también 1. Si no es el caso, se muestra un 0.
  • | (“Bitwise Or”): este operador da como resultado un 1 si uno de los dos operandos también tiene este valor.
  • ^ (XOR o “Bitwise exclusive OR”): este operador da como resultado un 0 si los operandos comparados tienen el mismo valor. En caso contrario, genera un 1.
  • << (desplazamiento a la izquierda): este operador desplaza el operando “a” hacia la izquierda en “b” posiciones. Si hay espacios, se completan con 0.
  • >> (desplazamiento a la derecha con signo, aritmético): este operador desplaza todos los bits de “a” a la derecha en “b” posiciones. Si el bit más significativo estaba establecido antes de la operación, permanece también después de esta, por lo que, si el número es negativo, sigue siendo negativo.
  • >>>> (desplazamiento a la derecha sin signo, lógico): este operador desplaza los bits de “a” en “b” posiciones hacia la derecha. Los espacios se rellenan siempre con 0.

Bitwise not

El operador “Bitwise not” de Java se representa con una tilde (~). Invierte todos los bits y, por tanto, convierte ceros en unos y unos en ceros. En el ejemplo que se presenta a continuación, se toma el número decimal 20, que en número binario es: 10100. Al aplicar el operador, se invierte cada bit, convirtiendo 10100 en 01011. Este es el valor de la expresión “~20”. Si se vuelve a convertir este último número binario en un número decimal, se obtiene el valor -21. Con el comando Java System.out.println puedes imprimir el resultado a partir del siguiente código:

public clase Main {
	public static void main(String[] args) {
	int valor1 = 20;
	System.out.println(~Valor1);
}
}
java

Si todo se ha introducido correctamente, se debería mostrar el resultado “-21”.

Bitwise And

Gracias a este operador, se comparan dos números en su forma binaria bit a bit. El primer bit del primer número se compara con el primer bit del segundo número, el segundo bit del primer número con el segundo bit del segundo número y así sucesivamente. Si ambos bits son 1, también se obtiene un 1. Si no es el caso (los dos bits son 0 o solo uno es 0), se obtiene un 0. Para el ejemplo presentado, se utilizan los números decimales 18 y 25 en su notación binaria: 18 es 10010 y 25 es 11001. Ahora se comparan los dos números entre sí para generar un tercer número a partir de ellos. Para una visión más clara, se escribe uno debajo de otro:

18 = 10010 25 = 11001

El primer bit de dos números es 1, por lo que el resultado también empezará por 1. Aunque el segundo bit de 25 también es 1, el segundo bit de 18 es 0, por lo que en el resultado se incluirá un 0 en esa posición. Si se van comparando los dos números bit a bit, finalmente se obtiene el número binario 10000. Al convertirlo en número decimal, el resultado es 16.

El código se vería:

public clase Main {
	public static void main(String[] args) {
	System.out.println(18&25);
}
}
java

En la consola se mostraría “16”.

Bitwise or

En el operador “Bitwise OR” de Java también se comparan bit a bit dos cifras en notación binaria. En este caso, sin embargo, basta que solo uno de los dos bits comparados tenga el valor 1 para obtener el resultado 1. Como ejemplo se toman de nuevo el 18 y el 25 del ejemplo anterior:

18 = 10010 25 = 11001

Como todos los bits (excepto el tercer dígito) contienen al menos un 1, este tercer número resulta: 11011. Convertido, obtenemos 27.

En código, este ejemplo se representa como se muestra:

public clase Main {
	public static void main(String[] args) {
	System.out.println(18|25);
}
}
java

XOR

XOR o “Bitwise exclusive OR” (^) se parece a Bitwise OR. Sin embargo, en el que caso de XOR solo se imprime un 1 si solamente uno de los dos bits comparados es 1. En el ejemplo queda más claro:

18 = 10010 25 = 11001

Como los dos primeros bits comparados con 1, el valor mostrado es 0. Sin embargo, el segundo bit de 18 es 0 y el de 25 es 1. En este caso, se obtiene 1 como resultado, porque solo uno de los dos bits comparados contiene el valor 1. Si se continúa, se obtiene el 01011. En notación decimal, se corresponde con el 11.

Este es el código correspondiente:

public clase Main {
	public static void main(String[] args) {
	System.out.println(18^25);
}
}
java

Desplazamiento a la izquierda

Con el desplazamiento a la izquierda, se desplazan los bits hacia la izquierda en “b” posiciones. Los espacios en blanco resultantes se completan con 0. Si se toma como valor “a” el 20, esto es, 10100 en notación binaria, y se desplaza un valor “b” 2, se obtiene el valor c 1010000. En este caso, es necesario incluir dos ceros al final. 1010000 corresponde al valor decimal 80.

En el código se ve como se muestra:

public clase Main {
	public static void main(String[] args) {
	int a = 20
	int b = 2
	int c = (a << b);
	System.out.println(c);
}
}
java

Desplazamiento a la derecha con signo

El desplazamiento a la derecha funciona en sentido contrario. Desplazamos los bits de “a” a la derecha en “b” posiciones y así obtenemos c. Los últimos bits se omiten. Si se desplaza el 20 o 10100 en dos posiciones a la derecha, el resultado es 00101 o 5.

El código es:

public clase Main {
	public static void main(String[] args) {
	System.out.println(20 >> 2);
}
}
java

Es importante destacar que los espacios se rellenan con 0 si a es un número positivo. Si es negativo, los espacios se sustituyen por 1.

Desplazamiento a la derecha sin signo

El operador de Java Bitewise desplazamiento a la derecha sin signo (>>>) funciona exactamente de la misma manera. La única diferencia es que los espacios creados en el lado izquierdo por un desplazamiento a la derecha siempre se completan con 0. En consecuencia, siempre se obtienen en números positivos, incluso si “a” era negativo.

¿Le ha resultado útil este artículo?
Page top