2013-03-06 6 views
6

में कनवर्ट करने का तेज़ तरीका मैं डिस्क से एक बड़ी फाइल पढ़ रहा हूं। उस फ़ाइल में केवल संख्याएं हैं, जो सादे पुराने ASCII के रूप में एन्कोडेड हैं। पल में, मैं मात्रा में पढ़ रहा हूँ, और फिर कुछ इस तरह कर रही है:बाइट [] स्ट्रिंग को इसके इंटीजर वैल्यू

byte[] token; // bytes representing a bunch of numbers 
int n = Integer.parseInt(new String(token)); 

दूसरे शब्दों में, मैं एक स्ट्रिंग में कनवर्ट करने कर रहा हूँ और फिर पूर्णांक के लिए स्ट्रिंग को पार्स। मैं जानना चाहता हूं कि इसके बजाय स्थानांतरण और बाइनरी अंकगणित जैसे तेज संचालन का उपयोग करने का कोई तरीका है या नहीं?

मुझे संदेह है कि इसे तेज़ी से बनाया जा सकता है। उदाहरण के लिए, संख्या 1,2,3 के लिए कच्चे बाइट 49,50,51 हैं। हैक के लिए कोई विचार?

+0

संख्या इनपुट फ़ाइल में सीमांकित कर रहे हैं कैसे? – Perception

+0

क्या इसमें कोई नकारात्मक पूर्णांक है? – kuriouscoder

+0

@ धारणा: इसके बारे में चिंता करने की कोई आवश्यकता नहीं है, मैंने पहले से ही सीमा को संभाला है। मैं जितनी जल्दी हो सके बाइट [] हिस्सों को विभाजित कर रहा हूं। – Dave

उत्तर

7
int n=0; 
    for(byte b : token) 
     n = 10*n + (b-'0'); 
+0

वाह, यह अच्छा है :) हालांकि आदेश पर निर्भर करता है। –

+0

यदि आप एसीआईआई अक्षरों की एक धारा पढ़ते हैं तो ऑर्डर पहले से ही ख्याल रखता है, ठीक है, या मुझे कुछ याद आ रहा है? – jdb

+0

यहां कोई एंडियन समस्या नहीं है। हालांकि, कुछ संस्कृति पहले सबसे कम अंक लिखेंगे? अरबी में कहें, हम 'عام 2013 هو عام جيد' जैसी चीजें देखते हैं। हम जानते हैं कि अरबी दाएं से बाएं लिखी गई है, इसलिए यहां अरबी संख्या सबसे कम अंक के साथ लिखी गई है? कोई जानकारी नहीं। – irreputable

2

आप आधार 10 संख्याओं के साथ बिल्कुल बाइनरी अंकगणित नहीं कर सकते हैं, लेकिन आप दशमलव अंकगणित कर सकते हैं। यह मानते हुए कि उच्च क्रम अंक पहले आओ:

byte[] token; 
long n = 0; 
long pow = 1; 
for(int i = token.length - 1; i >= 0; i--) { 
    n += (token[i]-48) * pow; 
    pow *= 10; 
} 
+0

धन्यवाद। दशमलव अंकगणित पर अच्छा बिंदु। – Dave

0

कोशिश

byte[] a = { 1, 2, 3 }; 
    for (int i = 0; i < a.length; i++) { 
     a[i] += '0'; 
    } 
    int n = Integer.parseInt(new String(a)); 
    System.out.println(n); 

उत्पादन

123 
+0

यह अनिवार्य रूप से मेरे मूल दृष्टिकोण के समान है। मैं नए स्ट्रिंग्स बनाने और फिर इनट्स को पार्स करने के अतिरिक्त ओवरहेड नहीं चाहता था। – Dave

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