जावा में दो long
मानों को कैसे जोड़ सकता है ताकि यदि परिणाम ओवरफ्लो हो तो यह श्रेणी 0xपर क्लैंप हो गया है?दो हस्ताक्षरित जावा 'लम्बे' मानों का संतृप्त जोड़ा
ints जोड़ने एक long
परिशुद्धता में अंकगणित को निष्पादित और परिणाम एक int
करने के लिए वापस डाल सकता, उदाहरण के लिए:
int saturatedAdd(int x, int y) {
long sum = (long) x + (long) y;
long clampedSum = Math.max((long) Integer.MIN_VALUE,
Math.min(sum, (long) Integer.MAX_VALUE));
return (int) clampedSum;
}
या
import com.google.common.primitives.Ints;
int saturatedAdd(int x, int y) {
long sum = (long) x + (long) y;
return Ints.saturatedCast(sum);
}
लेकिन long
के मामले में कोई बड़ा आदिम प्रकार जो इंटरमीडिएट (अनक्लेम्ड) योग को पकड़ सकता है।
इस के बाद से, जावा है मैं inline assembly उपयोग कर सकते हैं नहीं (विशेष रूप से SSE के संतृप्त ऐड निर्देश में।)
यह लागू किया जा सकता BigInteger
उदा का उपयोग कर,
static final BigInteger bigMin = BigInteger.valueOf(Long.MIN_VALUE);
static final BigInteger bigMax = BigInteger.valueOf(Long.MAX_VALUE);
long saturatedAdd(long x, long y) {
BigInteger sum = BigInteger.valueOf(x).add(BigInteger.valueOf(y));
return bigMin.max(sum).min(bigMax).longValue();
}
लेकिन प्रदर्शन के लिए महत्वपूर्ण है इसलिए इस विधि आदर्श नहीं है (हालांकि परीक्षण के लिए उपयोगी।)
मैं नहीं जानता कि क्या शाखाओं से बचने में काफी जावा में प्रदर्शन को प्रभावित कर सकते हैं। मुझे लगता है कि यह कर सकता है, लेकिन मैं ब्रांचिंग के साथ और बिना दोनों विधियों को बेंचमार्क करना चाहता हूं।
संबंधित: How to do saturating addition in C?
वास्तव में आप असेंबली का उपयोग कर सकते हैं, बशर्ते आप इसे जेएनआई, या जेएनए में लपेटें। प्रस्तावित समाधानों के बीच प्रदर्शन-वार देखना बहुत अच्छा होगा। – janislaw