Durante la navigazione del codice sorgente di Guava, mi sono imbattuto nel seguente pezzo di codice (parte dell'implementazione di hashCode
per la classe 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;
Entrambi adjust
e hash
sono int
s. Da quello che so di Java, ~
significa negazione bit per bit, quindi adjust = ~~adjust
e hash = ~~hash
dovrebbe lasciare invariate le variabili. Esecuzione del piccolo test (con asserzioni abilitate, ovviamente),
for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
assert i == ~~i;
}
lo conferma. Supponendo che i ragazzi di Guava sappiano cosa stanno facendo, ci deve essere un motivo per farlo. La domanda è cosa?
MODIFICA Come sottolineato nei commenti, il test sopra riportato non include il caso in cui è i
uguale Integer.MAX_VALUE
. Dato che i <= Integer.MAX_VALUE
è sempre vero, dovremo controllare quel caso al di fuori del ciclo per impedirne il ciclo per sempre. Tuttavia, la linea
assert Integer.MAX_VALUE == ~~Integer.MAX_VALUE;
produce l'avvertimento del compilatore "Confronto di espressioni identiche", che praticamente lo inchioda.
Integer.MAX_VALUE
. In contrasto con -(-Integer.MIN_VALUE) != Integer.MIN_VALUE
.
-Integer.MIN_VALUE
si avvolge a Integer.MIN_VALUE
, così negando che di nuovo semplicemente produce di Integer.MIN_VALUE
nuovo.
-x = (~x) + 1
.