2009-07-08 12 views
10

पहले मैं पूछना चाहिए:
किसी को भी जावा के लिए एक वर्तमान कार्यान्वयन 128b uint के जानता है?जावा: लागू करने के लिए एक अहस्ताक्षरित: 128 बिट पूर्णांक

मुझे प्राकृतिक कार्डिनल मान रखने के लिए कुछ चाहिए। यानी: एक बड़ा काउंटर।
मुझे बिगइंटर के बारे में पता है, जो धीमी और अपरिवर्तनीय हैं। एक 128 बी यूआईएनटी समझ में आता है ...

मैं आदिम लम्बे समय की एक जोड़ी का उपयोग करके एक ओडॉर्ड लागू करने के बारे में सोच रहा था।

ओवरफ्लो एक अपवाद फेंक देगा और लपेट नहीं होगा।

इस कक्षा के कार्यप्रणाली को लागू करने के लिए मुझे किस उदाहरण स्रोत कोड/ब्लॉग को देखना चाहिए?

+0

एक साल पहले इसी तरह कार्यान्वित किया गया था, और मैं बस इतना कह सकता हूं: मुझे आशा है कि आपको सटीक मॉड्यूलो/डिवीजन को लागू नहीं करना होगा ...;) – Tim

+2

आप OpenJDK से MutableBigInteger को पकड़ सकते हैं http://www.docjar.org /html/api/java/math/MutableBigInteger.java.html – akarnokd

उत्तर

0

BigInteger का उपयोग क्यों नहीं करें?

+10

BigInteger _slow_ है जब आपको केवल 64 बिट्स की आवश्यकता होती है .. एक साल पहले इस समस्या में भाग लें और मूल लंबे समय से 25 गुना धीमा हो गया । विवरण के लिए यह एवर देखें: http://stackoverflow.com/questions/962747/most-shameful-awesome-language-hack/1084538#1084538 – Tim

+9

ओडी ने कहा कि यह स्वीकार्य उत्तर है, क्योंकि उसने कहा था कि वह BigInteger नहीं चाहता था । –

+4

टिम, आपकी टिप्पणी में एक टूटा हुआ लिंक है। – Gili

4

मैं प्रतिनिधित्व के रूप में 32 बिट पूर्णांक का उपयोग करता हूं, क्योंकि आपको ले जाने, ओवरफ्लो डिटेक्शन और गुणा के लिए अतिरिक्त परिशुद्धता प्राप्त करने के लिए एक बड़ा प्रकार (लंबा) चाहिए। एक अंक के रूप में 32 बिट पूर्णांक के बारे में सोचें और प्राथमिक विद्यालय से एल्गोरिदम लागू करें।

+1

आप 64 बिट लंबे समय तक ठीक ==> दो बार तेजी से उपयोग कर सकते हैं। एक ले जाने के लिए साइन बिट में परिवर्तन द्वारा निर्धारित किया जा सकता है। –

+0

@ इरा बैक्सटर मुझे संदेह है कि यह तेज़ होगा। यह संभव होगा लेकिन अतिरिक्त के लिए अधिक जटिल, लेकिन गुणा के लिए नहीं। जावा बिगइन्टर int [] का उपयोग करता है, और मुझे लगता है कि वे जानते हैं कि वे क्या कर रहे हैं। – starblue

+0

यदि आप बहुत अधिक प्रदर्शन BigInt पैकेज चाहते हैं, तो आप अपनी मशीन पर उपलब्ध सबसे बड़ा शब्दकोष का उपयोग करें जिसके लिए मूल मशीन निर्देश समर्थन है। इन दिनों पीसी खोजने में मुश्किल है जो 64 बिट्स नहीं है। मैं अपनी स्थिति से खड़ा हूं: एक लंबा उपयोग करें। BigInt पैकेज में एल्गोरिदम शायद अधिकांश मल्टीप्रिजन पैकेजों के विशिष्ट हैं; लंबे समय से अपेक्षाकृत आसानी से छोड़ना चाहिए। बड़े बिगिनट्स के जोड़ अब आधे से ज्यादा चक्र लेते हैं। गुणा तेजी से 4x होना चाहिए क्योंकि आपको केवल 4 आधे चौड़े क्रॉस उत्पादों की बजाय 1 उत्पाद की आवश्यकता है। –

3

मुझे मत बताओ कि आप 128 स्थिर सेटर्स और गेटर्स रखने की योजना बना रहे हैं, प्रत्येक बिट के लिए ??? मैं निश्चित रूप से सेटबिट (इंट इंडेक्स, बूलियन वैल्यू) और getBit (int अनुक्रमणिका) के लिए उदाहरण विधियों के रूप में जाना चाहूंगा।

आपको और चीजों की आवश्यकता है: एक toString() विधि ताकि आप मानव पठनीय प्रतिनिधित्व प्राप्त कर सकें (किसी बिंदु पर आप संख्याओं को मुद्रित करना चाहते हैं, मुझे लगता है)।

याद रखें कि जावा में सभी सामान्य प्रकार हस्ताक्षर किए गए हैं (चार के अपवाद के साथ), इसलिए यदि आप दो लंबे समय तक उपयोग करने की योजना बना रहे हैं, तो हमेशा ध्यान रखें कि निचला हिस्सा अतिप्रवाहों का पता लगाने के लिए समस्याग्रस्त हो सकता है और ... वैसे भी, आपके पास 127 बिट नंबर होगा जब तक कि निचला भाग 63 बिट के रूप में नहीं माना जाएगा।

+0

ओपी ने प्रत्येक बिट के लिए सेटर्स पर इशारा किया था? –

+0

http://stackoverflow.com/revisions/1096964/list आपको आलोचना करने से पहले एक नज़र रखना चाहिए। – fortran

+1

ठीक है, अब मैं इसे देखता हूं। मुझे उम्मीद नहीं थी कि मुझे इसे समझने के लिए एक प्रश्न के संशोधन पढ़ना होगा; यह शीर्ष पर थोड़ा सा लगता है। मैंने आपकी प्रतिक्रिया को कम कर दिया है। –

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