我有一個System.Collections.BitArray數組(〜3000項),我想將所有的位左移1。但是集合似乎不支持該操作(即bitArray < < 1不工作,並沒有方法)。任何想法如何做到這一點?BitArray - 移位
謝謝!
我有一個System.Collections.BitArray數組(〜3000項),我想將所有的位左移1。但是集合似乎不支持該操作(即bitArray < < 1不工作,並沒有方法)。任何想法如何做到這一點?BitArray - 移位
謝謝!
這個簡單的代碼片段顯示了一個手動的方式來做到這一點。的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
使之成爲一個擴展方法不應該是一個大問題。
我最喜歡的方式是將BitArray轉換爲BigInt或類似的支持按位移位和返回的結構。現在,.Net 4中的內置BigInteger不支持我認爲的變化,但也有其他的做法,比如Mono的實現。
我不知道怎麼樣的效率,但這種擴展方法做這項工作
public static BitArray ShiftRight(this BitArray instance)
{
return new BitArray(new bool[] { false }.Concat(instance.Cast<bool>().Take(instance.Length - 1)).ToArray());
}
重新創建bitarray自己作爲一個包裝周圍ulong[]
;以小於64的數字執行移位是一塊蛋糕,它會比其他建議的方法花費更少的時間並殺死更少的北極熊。通過警惕「可能結束的位」,如果你想保留它們,你可能不得不增長數組(如果它們爲零,並且你認爲不存在的元素隱含地保持爲零)。
太棒了......但速度很慢。我雖然會有一個特殊的操作員或方法,因爲我們在玩比特。 – Martin 2010-09-10 11:12:49
您可以將內容從您的'BitArray'複製到'bool []',然後使用偏移量將數據複製到另一個'bool []'。最後,你可以從結果的'bool []'中重新創建你的'BitArray'。但我懷疑它會比訪問每個元素大約3000個位更快。 – 2010-09-10 11:49:40