2011-06-24 48 views
5

Bir BitArray'ı (std.bitmanip'ten) yarımlarına bölmem gerekir. Şimdiye kadar, dilimlemenin uygulanmadığını, bunun üzerinde yinelendiğini ve aralıklı istisna dışında üretilip atanmayacağını veya atadığını öğrendim. Ben başka bir türü (uzun/ulong içine sığdırmak için) çalıştım ama bu çok fazla sorun gibi görünüyor ve aynı zamanda aşağıda görüldüğü gibi yeni BitArrays init denemek çalıştığınızda aralık dışı bir istisna vermek:BitArray'i bölme

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

Sorunum için daha basit bir çözüm var mı? Eğer değilse, ne yapıyorum yanlış?

cevap

5

Bunu yapmanın nesi yanlış?

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]; 

Bunu küçük bir deneme vakasında denedim ve benim için iyi çalıştı.

Kodunuzun çalışmadığı nedeni, C dizisinin uzunluğunun sıfır olduğundan, C[0] erişiminin yasa dışı olduğu nedenidir. Önce boş bir BitArray eklemeniz gerekir.

BitArray[1] C, D; 

Not: Orijinal diziyi tutmak gerekmez, o zaman basitçe kullanarak ortadan ikiye kesebilir:

alternatif olarak statik bir dizi kullanmak

C ~= BitArray(); 

Veya,

A.length /= 2; 

Elbette, önce ikinci yarıyı kopyalamanız gerekir.

+0

Teşekkür ederiz! Dizlerimi statik yapmak için kolay yoldan gittim çünkü kötü bir uykuya ihtiyacım var. Bir dahaki sefere saf yolu deneyeceğim. – Byakkun