2010-09-10 55 views
6

我有一個System.Collections.BitArray數組(〜3000項),我想將所有的位左移1。但是集合似乎不支持該操作(即bitArray < < 1不工作,並沒有方法)。任何想法如何做到這一點?BitArray - 移位

謝謝!

回答

4

這個簡單的代碼片段顯示了一個手動的方式來做到這一點。的bitArray[0]值覆蓋:

//... 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 

使之成爲一個擴展方法不應該是一個大問題。

+2

太棒了......但速度很慢。我雖然會有一個特殊的操作員或方法,因爲我們在玩比特。 – Martin 2010-09-10 11:12:49

+0

您可以將內容從您的'BitArray'複製到'bool []',然後使用偏移量將數據複製到另一個'bool []'。最後,你可以從結果的'bool []'中重新創建你的'BitArray'。但我懷疑它會比訪問每個元素大約3000個位更快。 – 2010-09-10 11:49:40

0

我最喜歡的方式是將BitArray轉換爲BigInt或類似的支持按位移位和返回的結構。現在,.Net 4中的內置BigInteger不支持我認爲的變化,但也有其他的做法,比如Mono的實現。

2

System.Numerics.BigInteger的確支持位移。

+1

有一個注意事項:「與使用整數基元的按位左移操作不同,LeftShift方法保留原始BigInteger值的符號。」所以(-3 << 30)!=((BigInteger)( - 3)<< 30) – FarmerBob 2014-08-27 07:10:28

+0

而這是BigInteger類型的原因是Signed。 – detay 2016-01-10 09:39:09

1

我不知道怎麼樣的效率,但這種擴展方法做這項工作

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

OP要求左轉。我喜歡這個,所以這是一個左移版本: 返回新的BitArray( (instance.Cast ().Take(instance.Length - 1).ToArray()).Concat(new bool [] {newState}) .ToArray() ); – xgo 2017-06-28 20:31:04

+0

確實。謝謝 :) – eye 2017-08-08 08:30:00

0

重新創建bitarray自己作爲一個包裝周圍ulong[];以小於64的數字執行移位是一塊蛋糕,它會比其他建議的方法花費更少的時間並殺死更少的北極熊。通過警惕「可能結束的位」,如果你想保留它們,你可能不得不增長數組(如果它們爲零,並且你認爲不存在的元素隱含地保持爲零)。