Los ope­ra­do­res de Java bit a bit, también conocidos como ope­ra­do­res Bitwise, permiten manipular bits in­di­vi­dua­les según se requiera. En total, hay siete ope­ra­do­res, todos con una es­tru­c­tu­ra muy parecida. Además, las reglas que siguen son muy fáciles de entender.

¿Qué son los ope­ra­do­res de Java Bitwise y para qué se utilizan?

Los ope­ra­do­res de Java son una he­rra­mie­n­ta muy im­po­r­ta­n­te si estás tra­ba­ja­n­do con el lenguaje de pro­gra­ma­ción. Entre ellos, se en­cue­n­tran los ope­ra­do­res 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 ope­ra­do­res a diario, su utilidad se pondrá de ma­ni­fie­s­to en de­te­r­mi­na­das si­tua­cio­nes: 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 ope­ra­do­res a nivel de bit tienen un gran peso en las ope­ra­cio­nes de circuitos más complejos. Por todo ello, merece la pena entender el fu­n­cio­na­mie­n­to de estos ope­ra­do­res.

Web Hosting
El hosting que crece con tu proyecto
  • Tiempo de actividad de 99.99 % y seguridad ga­ra­n­ti­za­da
  • Aumenta el re­n­di­mie­n­to según el tráfico de tu página web
  • Incluye dominio, SSL, e-mail y soporte 24/7

¿Qué ope­ra­do­res Bitwise de Java existen?

Hay un total de siete ope­ra­do­res Bitwise di­fe­re­n­tes en Java. Para poder en­te­n­de­r­los mejor, se trabaja con los operandos “a” y “b”.

  • ~ (co­m­ple­me­n­to 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 co­m­pa­ra­dos tienen el mismo valor. En caso contrario, genera un 1.
  • << (de­s­pla­za­mie­n­to a la izquierda): este operador desplaza el operando “a” hacia la izquierda en “b” po­si­cio­nes. Si hay espacios, se completan con 0.
  • >> (de­s­pla­za­mie­n­to a la derecha con signo, ari­t­mé­ti­co): este operador desplaza todos los bits de “a” a la derecha en “b” po­si­cio­nes. Si el bit más si­g­ni­fi­ca­ti­vo estaba es­ta­ble­ci­do antes de la operación, permanece también después de esta, por lo que, si el número es negativo, sigue siendo negativo.
  • >>>> (de­s­pla­za­mie­n­to a la derecha sin signo, lógico): este operador desplaza los bits de “a” en “b” po­si­cio­nes hacia la derecha. Los espacios se rellenan siempre con 0.

Bitwise not

El operador “Bitwise not” de Java se re­pre­se­n­ta 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 co­n­ti­nua­ción, se toma el número decimal 20, que en número binario es: 10100. Al aplicar el operador, se invierte cada bit, co­n­vi­r­tie­n­do 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 in­tro­du­ci­do co­rre­c­ta­me­n­te, 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í su­ce­si­va­me­n­te. 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 pre­se­n­ta­do, 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 co­m­pa­ra­n­do los dos números bit a bit, fi­na­l­me­n­te se obtiene el número binario 10000. Al co­n­ve­r­ti­r­lo 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 co­m­pa­ra­dos 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. Co­n­ve­r­ti­do, obtenemos 27.

En código, este ejemplo se re­pre­se­n­ta 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 co­m­pa­ra­dos es 1. En el ejemplo queda más claro:

18 = 10010 25 = 11001

Como los dos primeros bits co­m­pa­ra­dos 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 co­m­pa­ra­dos contiene el valor 1. Si se continúa, se obtiene el 01011. En notación decimal, se co­rre­s­po­n­de con el 11.

Este es el código co­rre­s­po­n­die­n­te:

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

De­s­pla­za­mie­n­to a la izquierda

Con el de­s­pla­za­mie­n­to a la izquierda, se desplazan los bits hacia la izquierda en “b” po­si­cio­nes. Los espacios en blanco re­su­l­ta­n­tes 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 co­rre­s­po­n­de 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

De­s­pla­za­mie­n­to a la derecha con signo

El de­s­pla­za­mie­n­to a la derecha funciona en sentido contrario. De­s­pla­za­mos los bits de “a” a la derecha en “b” po­si­cio­nes y así obtenemos c. Los últimos bits se omiten. Si se desplaza el 20 o 10100 en dos po­si­cio­nes 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 im­po­r­ta­n­te destacar que los espacios se rellenan con 0 si a es un número positivo. Si es negativo, los espacios se su­s­ti­tu­yen por 1.

De­s­pla­za­mie­n­to a la derecha sin signo

El operador de Java Bitewise de­s­pla­za­mie­n­to a la derecha sin signo (>>>) funciona exac­ta­me­n­te de la misma manera. La única di­fe­re­n­cia es que los espacios creados en el lado izquierdo por un de­s­pla­za­mie­n­to a la derecha siempre se completan con 0. En co­n­se­cue­n­cia, siempre se obtienen en números positivos, incluso si “a” era negativo.

Ir al menú principal