2010-09-10 26 views
6

Bir System.Collections.BitArray dizilim (~ 3000 öğe) var ve tüm bitleri 1'e sola kaydırmak istiyorum. Ancak koleksiyon bu işlemi desteklemiyor gibi görünüyor (örn. BitArray < < 1 çalışmıyor ve hiçbir yöntem yoktur). Bunu nasıl yapacağın hakkında bir fikrin var mı?BitArray - Shift bitleri

Teşekkürler!

cevap

4

Bu basit snippet, bunu yapmanın manuel bir yolunu gösterir. bitArray[0] değeri yazılır:

//... bitArray is the BitArray instance 

for (int i = 1; i < bitArray.Count; i++) 
{ 
    bitArray[i - 1] = bitArray[i]; 
} 

bitArray[bitArray.Count - 1] = false // or true, whatever you want to shift in 

bu bir uzantısı yöntemi büyük bir anlaşma olmamalıdır yapma.

+2

Bu harika ... ama yavaş. Ben de bitlerle oynadığımız için özel bir operatör veya yöntem olurdu. – Martin

+0

İçeriği "BitArray" öğesinden bir "bool []" klasörüne kopyalamanın uzun yolunu ve verileri ofsetleri kullanarak başka bir bool [] 'a kopyalayabilirsiniz. Sonunda, "BitArray" inizi ortaya çıkan "bool []' dan yeniden oluşturabilirsiniz. Ama ~ 3000 bit için her bir öğeye erişmekten daha hızlı olacağından şüpheliyim. –

0

Başımın üst kısmından çıkmak için en kolay yol, BitArray'ı bitlik kaydırmayı ve geri dönüşü destekleyen BigInt veya benzeri bir yapıya dönüştürmektir. Şimdi, yerleşik Int BigInteger in .Net 4 düşüncemi değiştirmeyi desteklemiyor, ancak Mono'nun uygulaması gibi başka şeyler de var.

2

System.Numerics.BigInteger gerçekten bit kaydırmayı destekliyor.

+1

Bir uyarı ile: "Tamsayı ilkelleriyle bitsel sola kaydırma işleminin aksine, LeftShift yöntemi, orijinal BigInteger değerinin işaretini korur." Yani (-3 << 30)! = ((BigInteger) (- 3) << 30) – FarmerBob

+0

Ve bunun nedeni BigInteger tipi İmzalı. – detay

1

emin değilim nasıl verimliliği konusunda ama bu uzantı yöntemi

public static BitArray ShiftRight(this BitArray instance) 
{ 
    return new BitArray(new bool[] { false }.Concat(instance.Cast<bool>().Take(instance.Length - 1)).ToArray()); 
} 
+1

OP, vites değişikliği yaptı. Bunu beğendim, bu yüzden burada bir sol sürüm var: yeni BitArray ( (örnek.Cast () .Take (örnek.Length - 1) .ToArray()). Concat (yeni bool [] {newState}) .ToArray() ); – xgo

+0

Gerçekten. Teşekkürler :) – eye

0

yeniden oluşturun sarıcı olarak kendini bitarray işi yapar etrafında ulong[]; bitshift'i 64'ten küçük bir sayı ile uygulamak, bu şekilde bir parça kekdir ve diğer önerilen yaklaşımlardan daha az zaman alır ve daha az kutup ayısını öldürür. "Sonuna düşecek olan bitler" den dolayı, onları tutmak istiyorsanız diziyi büyütmeniz gerekebilir (ya da sıfır ise ve varolan öğenin örtük olarak sıfır olduğunu söylemişseniz).