SORU
19 NİSAN 2015, Pazar


Java çift tilde anlamı ( ~ ~ )?

Guava kaynak kodu göz atarken, kod (iç Sınıf hashCode uygulanması CartesianSet parçası) aşağıdaki parça geldi:

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 iki adjust hash ints. Tanıdığım kadarıyla, ~ Java yadsınması anlamına gelir ına, adjust = ~~adjust hash = ~~hash değişkenleri değiştirmeden bırakın. Küçük testi iddialar, elbette etkin) çalışan

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

bu doğrular. Guava adamlar ne yaptıklarını biliyor varsayarak, onlara bunu yapmak için bir nedeni olmalı. Soru nedir?

EDİTAçıklamalarda belirttiği gibi, yukarıdaki testi i Integer.MAX_VALUE eşittir davaya dahil değil. i <= Integer.MAX_VALUE her zaman doğru olduğundan, bu durum sonsuza kadar döngü önlemek için döngü dışında kontrol etmek gerekir. Ancak, satır

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

derleyici uyarı verir "Karşılaştırma aynı ifadeleri hemen hemen çivi.",

CEVAP
19 NİSAN 2015, Pazar


Java ' da bir anlamı yok.

Ama bu yorum Java JavaScript derlemek için bir yol olan bu hat özellikle GWT için olduğunu söylüyor.

JavaScript, tamsayılar--çift hareket olarak tamsayılar gibi. Örneğin 2^53, max bir değer var. Ama bitwise operators istediğini tam olarak eğer 32-bit eğer onlar gibi davran numaralarını, bu kod. Diğer bir deyişle, ~~hash diyor "" JavaScript. 32-bit bir sayı hash tedavi Özellikle, ama Java taşması nasıl aynı alt 32 bit ~ bit düzeyinde operatörler sadece alt 32 bit görünüyor beri (), atar.

Eğer o yok olursa, nesnenin hash kodunu farklı JavaScript arazi (GWT bir derleme) Java-arazi veya değerlendirilmiş olup olmadığını bağlı olacaktır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Keith Anthe

    Keith Anthe

    26 NİSAN 2011
  • olinerd

    olinerd

    23 AĞUSTOS 2007
  • Professor Messer

    Professor Me

    27 NİSAN 2007