example - ¿Qué significa ">>>" en java?
java list object example (3)
El operador >>>
es el docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html . Divide efectivamente el operando por 2
a la potencia del operando correcto, o solo 2
aquí.
La diferencia entre >>
y >>>
solo se mostraría al cambiar los números negativos. El operador >>
cambia un bit 1
en el bit más significativo si es un 1
, y el >>>
cambia un 0
independientemente.
ACTUALIZAR:
Hagamos un promedio de 1
y 2147483647
( Integer.MAX_VALUE
). Podemos hacer las matemáticas fácilmente:
(1 + 2147483647) / 2 = 2147483648 / 2 = 1073741824
Ahora, con el código (low + high) / 2
, estos son los bits involucrados:
1: 00000000 00000000 00000000 00000001
+2147483647: 01111111 11111111 11111111 11111111
================================================
-2147483648: 10000000 00000000 00000000 00000000 // Overflow
/2
================================================
-1073741824: 11000000 00000000 00000000 00000000 // Signed divide, same as >> 1.
Vamos a hacer el "cambio" a >>>
:
1: 00000000 00000000 00000000 00000001
+2147483647: 01111111 11111111 11111111 11111111
================================================
-2147483648: 10000000 00000000 00000000 00000000 // Overflow
>>> 1
================================================
+1073741824: 01000000 00000000 00000000 00000000 // Unsigned shift right.
Esta pregunta ya tiene una respuesta aquí:
- Diferencia entre >>> y >> 7 respuestas
- Java >>> Operador [duplicado] 3 respuestas
Encontré este código para encontrar duplicados en SO post aquí. pero no entiendo lo que significa esta línea int mid = (low + high) >>> 1;
private static int findDuplicate(int[] array) {
int low = 0;
int high = array.length - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
System.out.println(mid);
int midVal = array[mid];
if (midVal == mid)
low = mid + 1;
else
high = mid - 1;
}
return high;
}
El significado de
int mid = (low + high) >>> 1;
es; al usar el turno sin firmar, evita desbordamientos que resultan en un número negativo. Esto es necesario ya que Java no admite valores unsigned int
. (Por cierto, el char
no está firmado)
La forma tradicional de escribir esto era
int mid = (low + high) / 2; // don''t do this
sin embargo, esto podría desbordarse para sumas más grandes y se obtiene un número negativo para la mitad.
p.ej
int high = 2100000000;
int low = 2000000000;
System.out.println("mid using >>> 1 = " + ((low + high) >>> 1));
System.out.println("mid using / 2 = " + ((low + high) / 2));
huellas dactilares
mid using >>> 1 = 2050000000
mid using / 2 = -97483648
Claramente el segundo resultado es incorrecto.
Es un operador bit a bit. Funciona en el valor de bit. Supongamos que si A tiene 60, entonces A >>> 2 dará 15 (valor de bit 0000 1111)
Su nombre real es "Shift Zero right Operator" aquí el valor de los operandos de la izquierda se mueve hacia la derecha por el número de bits especificado (2 en este caso) por el operando de la derecha y los valores desplazados se llenan con ceros (0000).