Guava'nın kaynak koduna göz atarken, aşağıdaki kod parçasına rastladım ( hashCode
iç sınıf için uygulamanın bir parçası 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;
Her ikisi de adjust
ve hash
olan int
lar. Ben Java hakkında bildiklerimizi itibaren ~
olumsuzlama bit düzeyinde yollarla, yani adjust = ~~adjust
ve hash = ~~hash
değişmeden değişkenleri bırakmalısınız. Küçük testi çalıştırmak (elbette iddialar etkinken),
for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
assert i == ~~i;
}
bunu doğrular. Guava'lıların ne yaptığını bildiklerini varsayarsak, bunu yapmaları için bir sebep olmalı. Soru ne?
DÜZENLEME Yorumlarda belirtildiği gibi, yukarıdaki test i
eşittir Integer.MAX_VALUE
. Yana i <= Integer.MAX_VALUE
hep doğrudur, sonsuza döngü önlemek için döngü dışında çantayı kontrol etmek gerekir. Ancak, çizgi
assert Integer.MAX_VALUE == ~~Integer.MAX_VALUE;
derleyici uyarısı verir "özdeş ifadeleri karşılaştırmak", hemen hemen çivi.
Integer.MAX_VALUE
. İle kontrast -(-Integer.MIN_VALUE) != Integer.MIN_VALUE
.
-Integer.MIN_VALUE
etrafına sarar Integer.MIN_VALUE
, böylece tekrar tekrar basitçe üretir Integer.MIN_VALUE
.
-x = (~x) + 1
.