Quelle est la signification du double tilde (~~) en Java?



Answers

Question

En parcourant le code source de Guava, je suis tombé sur le morceau de code suivant (partie de l'implémentation de hashCode pour la classe interne 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;

Les deux d' adjust et de hash sont int s. D'après ce que je sais de Java, ~ signifie une négation au niveau des bits, donc adjust = ~~adjust et hash = ~~hash devrait laisser les variables inchangées. Exécuter le petit test (avec des assertions activées, bien sûr),

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

confirme cela. En supposant que les gars de la goyave sachent ce qu'ils font, il doit y avoir une raison pour qu'ils le fassent. La question est quoi?

EDIT Comme indiqué dans les commentaires, le test ci-dessus n'inclut pas le cas où i est égal à Integer.MAX_VALUE . Puisque i <= Integer.MAX_VALUE est toujours vrai, nous devrons vérifier ce cas en dehors de la boucle pour l'empêcher de boucler pour toujours. Cependant, la ligne

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

donne l'avertissement du compilateur "Comparant des expressions identiques", ce qui le cloue à peu près.




Related