जब अमरूद के स्रोत कोड को ब्राउज़ करते हैं, तो मैं निम्नलिखित कोड कोड ( 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।