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


0 Answers

moteur de recherche bibliographique scientifique

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