2012-10-07 87 views
24

मैं दो इंच एक लंबे समय तक स्टोर करना चाहता हूं (हर बार एक नया Point ऑब्जेक्ट बनाने के बजाय)।जावा लंबे समय में दो इन्स भंडारित करता है

वर्तमान में, मैंने यह कोशिश की। यह काम कर रहा है नहीं है, लेकिन मैं नहीं जानता कि क्या इसके साथ गलत है:

// x and y are ints 
long l = x; 
l = (l << 32) | y; 

और मैं तो जैसे पूर्णांक मान हो रही है:

x = (int) l >> 32; 
y = (int) l & 0xffffffff; 

उत्तर

47

y पहले में हो रही साइन-बढ़ाया है स्निपेट, y < 0 के साथ x-1 के साथ ओवरराइट करेगा।

दूसरे स्निपेट में, int पर कास्ट शिफ्ट से पहले किया जाता है, इसलिए x वास्तव में y का मान प्राप्त करता है।

long l = (((long)x) << 32) | (y & 0xffffffffL); 
int x = (int)(l >> 32); 
int y = (int)l; 
+0

आह, यह समझ में आता है। मेरे पास एक सवाल यह है कि यदि आप लंबे 0xffffffffL या int 0xffffffff का उपयोग करते हुए बिटकमास्क करते हैं तो यह महत्वपूर्ण है या नहीं। – LanguagesNamedAfterCofee

+1

@LanguagesNamedAfterCofee हाँ यह महत्वपूर्ण है, यदि आप '0xffffffff' (एल के बिना) के साथ मुखौटा करते हैं तो यह केवल एक int है, इसलिए' & 'एक नो-ऑप है और 'y' * अभी भी साइन विस्तारित हो जाता है *। – harold

+0

ठीक है, स्पष्टीकरण के लिए धन्यवाद! – LanguagesNamedAfterCofee

9

यहां एक और विकल्प है जो बिटवाई ऑपरेटरों के बजाय बाइटबफर का उपयोग करता है। स्पीड-वार, यह धीमा है, लगभग 1/5 गति है, लेकिन यह देखने में बहुत आसान है कि क्या हो रहा है:

long l = ByteBuffer.allocate(8).putInt(x).putInt(y).getLong(0); 
// 
ByteBuffer buffer = ByteBuffer.allocate(8).putLong(l); 
x = buffer.getInt(0); 
y = buffer.getInt(1);