जावा में डबल टिल्ड (~~) का अर्थ क्या है?


192

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

संकलक चेतावनी "समान भावों की तुलना" करता है, जो इसे बहुत अधिक नाखून देता है।


42
@dr_andonuts अमरूद इन दिनों एक परियोजना में शामिल करने के लिए एक सुंदर मानक पुस्तकालय है - मुझे लगता है कि दूर तक चलाने की सलाह गलत है।
यशवत

4
मुखर किनारे के मामले की जांच नहीं करता है Integer.MAX_VALUE। के साथ विपरीत -(-Integer.MIN_VALUE) != Integer.MIN_VALUE
फ्रेंकी

3
@Franky क्या Maaartinus ने कहा। -Integer.MIN_VALUEचारों ओर लपेटता है Integer.MIN_VALUE, इतना नकारात्मक है कि फिर से बस फिर से पैदा करता है Integer.MIN_VALUE

2
@maaartinus, @hvd, जो इंगित करने के लिए धन्यवाद। अब मुझे वह याद है -x = (~x) + 1
फ्रेंकी

7
@dr_andonuts ट्रोलिंग? उन चीजों से दूर क्यों भागें जिन्हें आप नहीं समझते हैं। यह वही है जो स्टैकऑवरफ्लो आपके लिए यहां है: आपको सीखने में मदद करने के लिए।
जेरेड बुरोज

जवाबों:


245

जावा में, इसका मतलब कुछ भी नहीं है।

लेकिन उस टिप्पणी में कहा गया है कि लाइन विशेष रूप से GWT के लिए है, जो जावा को जावास्क्रिप्ट को संकलित करने का एक तरीका है।

जावास्क्रिप्ट में, पूर्णांक की तरह डबल्स-दैट-एक्ट-एज़-पूर्णांक होते हैं। उदाहरण के लिए, उनके पास 2 ^ 53 का अधिकतम मूल्य है। लेकिन बिटवाइज़ ऑपरेटर्स संख्याओं का इलाज करते हैं जैसे कि वे 32-बिट हैं, जो कि आप इस कोड में चाहते हैं। दूसरे शब्दों में, जावास्क्रिप्ट में "एक 32-बिट संख्या के रूप में ~~hashसमझो hash"। विशेष रूप से, यह सभी को छोड़ देता है, लेकिन नीचे के 32 बिट्स (बिटवाइज़ के बाद से)~ ऑपरेटर केवल नीचे के 32 बिट्स को देखते हैं), जो कि जावा के अतिप्रवाह के समान है।

यदि आपके पास ऐसा नहीं है, तो ऑब्जेक्ट का हैश कोड इस आधार पर भिन्न होगा कि यह जावा-भूमि या जावास्क्रिप्ट भूमि में मूल्यांकन किया गया है (जीडब्ल्यूटी संकलन के माध्यम से)।


10
@ हेरोल्ड यह एक GWT बात नहीं है, यह एक जावास्क्रिप्ट बात है। उस भाषा में अब बस संख्या काम करती है।
यशवत

18
@yshavit हालांकि, यह नहीं है कि जावा में नंबर कैसे काम करते हैं। यदि जीडब्ल्यूटी इस तथ्य को छिपाता नहीं है कि जेएस में और उपयोगकर्ता से जेवीएम पर संख्याओं को अलग-अलग लागू किया जाता है, तो यह वास्तव में एक खराब संकलक है।
वैलडरमैन

8
@harold, हाँ, यह जावास्क्रिप्ट है जो पूर्णांकों को गलत तरीके से लागू करता है (वास्तव में जावास्क्रिप्ट में पूर्णांक प्रकार के रूप में ऐसी कोई चीज नहीं है)।
माइकइलियार

8
@valderman यह एक अच्छी बात है। |0या ऐसा ~~लगता है जैसे जोड़ना मुश्किल नहीं होगा, हालांकि मुझे नहीं पता कि प्रदर्शन हिट क्या होगा (आपको इसे हर अभिव्यक्ति के हर चरण पर जोड़ना होगा)। मुझे नहीं पता कि डिजाइन के विचार क्या थे। Fwiw, असंगतता GWT के संगतता पृष्ठ पर प्रलेखित है ।
यशवित

6
hashCodeयह अजीब है कि यह जानबूझकर अदालतों, या यहां तक ​​कि उम्मीद है, होने के लिए अतिप्रवाह। एकमात्र स्थान जिसे आप असंगतता का पालन कर सकते हैं, जहां एक सामान्य जावा इंट ओवरफ़्लो होगा, जो कि ज्यादातर कोड में आने वाला मुद्दा नहीं है; यह सिर्फ इस एक अजीब मामले में प्रासंगिक है।
लुइस वास्समैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.