2011-06-24 9 views
5

को विभाजित करने के लिए मुझे एक बिटरायर (std.bitmanip से) को अपने आधा भाग में विभाजित करने की आवश्यकता है। अब तक मुझे पता चला है कि टुकड़ा लागू नहीं किया गया है, इसे फिर से लागू करना और संलग्न करना या असाइन करना अनिवार्य रूप से सीमा अपवाद से बाहर उत्पादन करता है। मैंने इसे किसी अन्य प्रकार में परिवर्तित करने की कोशिश की है (यह लंबे/उलझन में फिट बैठता है) लेकिन यह बहुत अधिक परेशानी की तरह लगता है और यह मुझे सीमा के अपवाद से बाहर भी देता है जब मैं नीचे बताए गए नए बिटराइट्स को अंदरमाने की कोशिश करता हूं:बिटाएरे

BitArray[] C, D; 
long lg = toLong(bitArr); 
C[0].init(cast(void[])((lg >> 28) & 0x0fff_ffff), 28); 

क्या मेरी समस्या के लिए कोई आसान समाधान है? यदि नहीं, तो मैं क्या गलत कर रहा हूँ?

उत्तर

5

मूर्खतापूर्ण तरीके से क्या करना गलत है?

BitArray A, B, C; 
A = /* ... */ 

// Split A into B & C 
auto n = A.length; 
B.length = n/2; 
foreach (i; 0..n/2) 
    B[i] = A[i]; 

C.length = n - n/2; 
foreach (i; n/2..n) 
    C[i-n/2] = A[i]; 

मैंने इसे थोड़ा परीक्षण केस पर करने की कोशिश की और यह मेरे लिए ठीक काम किया।

आपका कोड काम नहीं करने का कारण यह है कि सरणी की लंबाई C शून्य है, इसलिए C[0] तक पहुंच अवैध है। आपको पहले खाली BitArray जोड़ना होगा।

C ~= BitArray(); 

या, वैकल्पिक रूप से, एक स्थिर सरणी का उपयोग करें:

BitArray[1] C, D; 

नोट: यदि आप मूल सरणी रखने की जरूरत नहीं है, तो आप इसके छमाही में बस का उपयोग करके कटौती कर सकते हैं:

A.length /= 2; 

बेशक, आपको पहले दूसरे छमाही की प्रतिलिपि बनाना होगा।

+0

धन्यवाद! मैं अभी अपने सरणी स्थिर बनाने का आसान तरीका चला गया है क्योंकि मुझे कुछ नींद की बुरी जरूरत है। मैं अगली बार बेवकूफ तरीके से कोशिश करूंगा। – Byakkun

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

  • कोई संबंधित समस्या नहीं^_^