validar usar reemplazar leer con acentos java gwt bit-manipulation bitwise-operators

reemplazar - usar ñ en java



¿Cuál es el significado de doble tilde(~~) en Java? (1)

Al examinar el código fuente de Guava, me encontré con el siguiente código (parte de la implementación de hashCode para la clase interna CartesianSet ):

int adjust = size() - 1; for (int i = 0; i < axes.size(); i++) { adjust *= 31; adjust = ~~adjust; // in GWT, we have to deal with integer overflow carefully } int hash = 1; for (Set<E> axis : axes) { hash = 31 * hash + (size() / axis.size() * axis.hashCode()); hash = ~~hash; } hash += adjust; return ~~hash;

Tanto el adjust como el hash son int s. Por lo que sé sobre Java, ~ significa negación a nivel de bits, por lo que adjust = ~~adjust y hash = ~~hash debería dejar las variables sin cambios. Ejecutando la pequeña prueba (con aserciones habilitadas, por supuesto),

for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) { assert i == ~~i; }

confirma esto Suponiendo que los chicos de la guayaba saben lo que están haciendo, debe haber una razón para que hagan esto. La pregunta es qué?

EDITAR Como se señaló en los comentarios, la prueba anterior no incluye el caso en el que i es igual a Integer.MAX_VALUE . Como i <= Integer.MAX_VALUE siempre es verdadero, tendremos que verificar ese caso fuera del ciclo para evitar que se repita para siempre. Sin embargo, la linea

assert Integer.MAX_VALUE == ~~Integer.MAX_VALUE;

produce la advertencia del compilador "Comparación de expresiones idénticas", que prácticamente lo clava.


En Java, no significa nada.

Pero ese comentario dice que la línea es específicamente para GWT, que es una forma de compilar Java a JavaScript.

En JavaScript, los enteros son algo así como dobles-que-actúan como enteros. Tienen un valor máximo de 2 ^ 53, por ejemplo. Pero los operadores bit a bit tratan los números como si fueran de 32 bits, que es exactamente lo que quieres en este código. En otras palabras, ~~hash dice "tratar el hash como un número de 32 bits" en JavaScript. Específicamente, descarta todos menos los 32 bits inferiores (ya que los operadores ~ bit a bit solo miran los 32 bits inferiores), que es idéntico a cómo funciona el desbordamiento de Java.

Si no tuviera eso, el código hash del objeto sería diferente dependiendo de si se evalúa en Java-Land o en JavaScript Land (a través de una compilación GWT).