2009-04-20 15 views
10

मैं 0 से 2^64 - 1 की सटीक क्षमता वाले एक डेटाटाइप की तलाश में हूं। 1. हम जानते हैं कि जावा के रूप में यह 'हस्ताक्षरित' बार्सिंग डेटा डेटाटाइप का समर्थन नहीं करता है।BigInteger क्लास का उपयोग कर जावा में एक हस्ताक्षरित 64-बिट int को कैसे कार्यान्वित करें?

बिगइंटर वर्ग है जो बड़ी संख्या में निर्माण की अनुमति देता है जो लंबे डेटाटाइप का समर्थन नहीं कर सकता है। लेकिन मुझे यकीन नहीं है कि बिगइंटर वर्ग कैसे मेरे उद्देश्य की सेवा करेगा। BigInteger क्लास केवल रचनाकारों के माध्यम से असाइनमेंट की अनुमति देता है। मुझे निम्नलिखित संभावना दिखाई देती है लेकिन यह एक यादृच्छिक संख्या उत्पन्न करती है।

BigInteger(int numBits, Random rnd) 
Constructs a randomly generated BigInteger, uniformly distributed over the range 0 to (2^numBits - 1), inclusive. 

मैं एपीआई कि मुझे इस BigInteger करने के लिए अपने स्वयं के मूल्य का चयन करते हैं चाहते हैं के किसी भी setValue (एक्स) तरह नहीं देख सकता। BigInteger क्लास का उपयोग करके इसे कैसे कार्यान्वित करें या क्या ऐसा करने का कोई अन्य तरीका है? कृपया कोड नमूना पोस्ट करें।

पीएस: here द्वारा पोस्ट किया गया प्रश्न कार्यान्वयन विवरण नहीं है।

+1

क्या आप कृपया स्पष्ट कर सकते हैं कि आपको डेटा प्रकार की आवश्यकता क्यों है और आप इसके साथ क्या करने का प्रयास कर रहे हैं? समस्या को सरल बनाने के तरीके हो सकते हैं ... – Alnitak

+0

सी ++ ऐसे डेटाटाइप का समर्थन करता है।मैं सी ++ के साथ बातचीत कर रहा हूं और सोचा था कि डेटा में हेरफेर करने और इसे C++ अंत में बदलने के बजाय जावा एंड पर एक समान डेटाटाइप होना बेहतर होगा। –

उत्तर

1

BigInteger एस अपरिहार्य हैं, जैसा कि आपने पाया है। आप BigInteger subclassing में देखना चाहते हैं, और अपने स्वयं के कन्स्ट्रक्टर लिखना चाहते हैं जो इनपुट को मान्य करता है, और प्रासंगिक सीमा में एक सकारात्मक BigInteger उत्सर्जित करता है।

संख्या को केवल 64 बिट्स का उपयोग करने की आवश्यकता को बनाए रखने के लिए, आपको विभिन्न परिचालनों को भी अधिभारित करने की आवश्यकता हो सकती है, इसलिए वे परिणाम को सीमित करते हैं और एक नए बिगइंटर के बजाए अपनी नई कक्षा का एक उदाहरण लौटाते हैं।

यह शायद काम का थोड़ा सा है, लेकिन अभी भी इसे स्क्रैच से करने से कहीं बेहतर होना चाहिए।

1

आप BigInteger.valueOf (l) के साथ लंबे समय से बिगइंटर बना सकते हैं, जहां एल लंबा है।

लेकिन यदि आप सटीक 64-बिट्स के साथ काम करना चाहते हैं, तो मैं बस लंबे समय तक उपयोग करता हूं।

3

क्यों अपना स्वयं का रैपर लिखें और हस्ताक्षरित लंबे समय तक उपयोग न करें। यदि उपयोगकर्ता बिगइंटर के रूप में हस्ताक्षरित मान लाने की इच्छा रखता है - साइन का परीक्षण करें और BigInteger में 2^64 जोड़ें।

2

आप एक UInt64 वर्ग बनाना चाहते हैं, जो बिगइंटर को समाहित करता है; आप यह भी जांच सकते हैं कि प्रत्येक ऑपरेशन (एड, मूल, इत्यादि) एक हस्ताक्षरित 64 बिट BigInteger देता है; अतिप्रवाह हो सकता है मुश्किल

class UInt64 { 

    private final BigInteger value; 

    private UInt64(BigInteger aValue) { 
     // method to enforce your class invariant: 0...2**64-1 
     checkInvariantOf(aValue); 
     value = aValue; 
    } 

    public static UInt64 of(String value) { 
     return new UInt64(new BigInteger(value)); 
    } 

    public UInt64 add(UInt64 v) { 
     return new UInt64(value.add(v.value)); 
    } 

    .... 
} 
7

आप अक्सर जावा के हस्ताक्षर किए संख्यात्मक डेटा प्रकार का उपयोग कर सकते हैं जैसे कि वे अहस्ताक्षरित थे अनुकरण।

जावा में हस्ताक्षरित बनाम हस्ताक्षर किए गए इस old answer देखें।

1

आप मूल्यों को 0 से 2^64-1 तक लंबे मूल्य में स्टोर कर सकते हैं।

कई ऑपरेशन अपेक्षित काम करते हैं हालांकि अधिकांश एपीआई और कुछ ऑपरेशन केवल काम करते हैं क्योंकि वे हस्ताक्षरित संचालन मानते हैं हालांकि कामकाज होते हैं।

बिगइंटर का उपयोग करना आपके सिर को पाने के लिए आसान हो सकता है। ;)

+0

लंबे समय -2^63 से (2^63) -1 का समर्थन करता है क्योंकि पहली बिट साइन बिट है। मैं बिना हस्ताक्षर किए लंबे समय चाहता हूं जो तब 0 से (2^64) -1 तक होगा। यह 2^(64-1) नहीं है जो मैं चाहता हूं। यह है (2^64) -1। –

+2

मेरा मानना ​​है कि भेद आपके ऊपर है। यदि आप +, -, ^, &, |, <<, > >> का उपयोग करते हैं, तो आप पाएंगे कि परिणाम अलग-अलग है। यदि आप Long.toHexString (लंबा) कहते हैं तो यह ऋणात्मक संख्या मुद्रित नहीं करेगा। –

+1

भी == और! =;) –

1

जावा एसई 8 और बाद में, आप लंबे डेटा प्रकार का उपयोग एक हस्ताक्षरित 64-बिट लंबे का प्रतिनिधित्व करने के लिए कर सकते हैं, जिसमें न्यूनतम मान 0 और 2^64-1 का अधिकतम मान है।

+1

इस उत्तर में कोड उदाहरण जोड़ने या कुछ दस्तावेज़ों के लिंक को जोड़ने में बहुत मददगार होगा। – CubeJockey

+0

http://docs.oracle.com/javase/8/docs/api/java/lang/Long.html - नए कार्यों पर ध्यान दें ... 'तुलना करें' हस्ताक्षर 'और इस तरह ... यह भी पीटर के प्रति संकेत देता है लॉरी अपने उत्तरों और टिप्पणियों में कह रही थीं। –

संबंधित मुद्दे