जब अमरूद के स्रोत कोड को ब्राउज़ करते हैं, तो मैं निम्नलिखित कोड कोड ( hashCode
आंतरिक वर्ग के लिए कार्यान्वयन का हिस्सा) भर में आया 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;
दोनों adjust
और hash
कर रहे हैं int
रों। मुझे जावा के बारे में जो कुछ भी पता है, उसका ~
मतलब है कि बिटवाइस नेगेटिव, इसलिए adjust = ~~adjust
और hash = ~~hash
चर को अपरिवर्तित छोड़ देना चाहिए। छोटे परीक्षण (जोर देकर सक्षम, निश्चित रूप से),
for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
assert i == ~~i;
}
इस बात की पुष्टि करता है। यह मानते हुए कि अमरूद लोग जानते हैं कि वे क्या कर रहे हैं, उनके लिए ऐसा करने का एक कारण होना चाहिए। सवाल है क्या?
संपादित करें जैसा कि टिप्पणियों में बताया गया है, ऊपर दिए गए परीक्षण में वह मामला शामिल नहीं है जहाँ i
बराबरी होती है Integer.MAX_VALUE
। चूंकि i <= Integer.MAX_VALUE
हमेशा सच होता है, हमें उस मामले को हमेशा के लिए लूप से रोकने के लिए लूप के बाहर जांचना होगा। हालाँकि, रेखा
assert Integer.MAX_VALUE == ~~Integer.MAX_VALUE;
संकलक चेतावनी "समान भावों की तुलना" करता है, जो इसे बहुत अधिक नाखून देता है।
Integer.MAX_VALUE
। के साथ विपरीत -(-Integer.MIN_VALUE) != Integer.MIN_VALUE
।
-Integer.MIN_VALUE
चारों ओर लपेटता है Integer.MIN_VALUE
, इतना नकारात्मक है कि फिर से बस फिर से पैदा करता है Integer.MIN_VALUE
।
-x = (~x) + 1
।