example java arrays primitive

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í:

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