2011-06-24 69 views
5

我需要將BitArray(來自std.bitmanip)拆分爲其一半。直到現在我已經發現切片沒有實現,迭代它並追加或分配產生超出範圍的例外。我試圖將它轉換成其他類型(它適合於long/ulong),但這似乎太麻煩了,它也給我一個超出範圍的例外,當我嘗試啓動新的BitArrays如下所示:如何拆分BitArray

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