2013-08-06 2 views
7

मैं कुछ बिट एक लंबे मूल्य के साथ से लेकर उदाहरण के लिए, निकालने के लिए की जरूरत से थोड़ा पर्वतमाला मिलती है:जावा एक लंबे

long input = 15367 (11110000000111) 

मैं क्या जरूरत के लिए तो मूल लंबे से दो लंबे मूल्यों को निकालने के लिए है,

First long is 5 bits starting from bit 0, so bits 0:4 = 7 (0111) 
Second long is 56 bits starting from bit 8, so bits 7:55 = 60 (1111000) 

मैं जानता हूँ कि यह थोड़ा स्थानांतरण और मास्किंग के साथ किया जा सकता है, लेकिन मैं पूरी तरह यकीन है कि लागू करने के लिए कैसे तो यह हर बार गतिशील है, हर बार के रूप में मैं यह करने की आवश्यकता नहीं कर रहा हूँ, लंबे समय से अलग होगा , और इसी तरह विशिष्ट बिट सीमा भी होगी।

मैं बिट्ससेट्स और बिटअरेज़ के बारे में पढ़ रहा हूं, हालांकि मुझे पूरी तरह से यकीन नहीं है कि यह नौकरी के लिए सही चीजें हैं।

इसे लागू करने के सर्वोत्तम तरीके पर कोई सलाह बहुत सराहना की जाएगी।

धन्यवाद!

उत्तर

8

offset ऑफसेट से शुरू nrBits बिट्स निकालने के लिए, आप कर सकते हैं:

public static long extractSub(final long l, final int nrBits, final int offset) 
{ 
    final long rightShifted = l >>> offset; 
    final long mask = (1L << nrBits) - 1L; 
    return rightShifted & mask; 
} 

नोट >>> सही पारी ऑपरेटर के उपयोगकर्ता; ऐसा इसलिए है कि आप साइन बिट को चारों ओर नहीं ले जाते हैं।

(1L << nrBits) - 1L के रूप में, यह 2^nrBits - 1 है। Llong स्थिरांक होना है।

यह भी ध्यान दें कि "सीमा जांच" नहीं है (उदाहरण के लिए, 63 या नकारात्मक से अधिक बिट्स ऑफसेट या ऑफसेट)।

+0

बस टिकट, धन्यवाद fge! – Tony

+1

'>>' काम भी नहीं करेगा क्योंकि अंत में '&' संकेत विस्तारित '1' को हटा देगा? (आपके पक्ष में कोने का मामला: आप अपने इनपुट की बाएं सीमाओं के बाहर बिट्स निकालते हैं, उदाहरण के लिए nrBits = 32, ऑफ़सेट> 32) – zapl

+0

नहीं, ऐसा नहीं होगा। कहें (सरल बनाने के लिए 8 बिट्स के साथ) कि आपके पास '10001111' है और ऑफसेट 3 से शुरू होने वाली तीन बिट निकालना चाहता था: यदि आप '>>' का उपयोग करते हैं, तो सही शिफ्ट '00010001' देता है, लेकिन' >> 'के साथ '11110001' दें (साइन बिट ले जाया गया है)। – fge

2

के बीच थोड़ा एक्स और बिट y, x दो संख्याओं का बड़ा है बिट्स निकालने के लिए, आप कह सकते हैं

long mask = (Math.pow(2,x+1)-1)- (Math.pow(2,y+1)-1); 
long extract = input & mask; 
+0

'पाउ (2, एन)' के बजाय आप '1 << n' का उपयोग कर सकते हैं। और आप शायद '&&' के बजाय '&' का अर्थ है। – arshajii

+0

क्षमा करें, एकल और, आप सही हैं - ठीक है। 1 एन पदों को स्थानांतरित करना भी अच्छा है, शायद तेज़। – user1111284

+0

धन्यवाद उपयोगकर्ता 1111284! – Tony

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