C# 位数组-移位位

C# 位数组-移位位,c#,.net,bitarray,C#,.net,Bitarray,我有一个System.Collections.BitArray数组(~3000项),我想将所有位向左移动1。但是,集合似乎不支持该操作(即bitArray此简单片段显示了手动执行此操作的方法。bitArray[0]的值被覆盖: //... bitArray is the BitArray instance for (int i = 1; i < bitArray.Count; i++) { bitArray[i - 1] = bitArray[i]; } bitArray[bit

我有一个System.Collections.BitArray数组(~3000项),我想将所有位向左移动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是bitArray实例
for(int i=1;i

将此作为扩展方法应该没什么大不了的。

我想最简单的方法就是将位数组转换为BigInt或类似的结构,支持按位移位和返回。现在,我认为.Net 4中内置的int biginger不支持移位,但也有其他方法支持移位,比如Mono的实现

System.Numerics.BigInteger确实支持位移位。

我不确定效率如何,但这种扩展方法可以做到这一点

public static BitArray ShiftRight(this BitArray instance)
{
    return new BitArray(new bool[] { false }.Concat(instance.Cast<bool>().Take(instance.Length - 1)).ToArray());
}
公共静态位数组ShiftRight(此位数组实例)
{
返回新的位数组(new bool[]{false}.Concat(instance.Cast().Take(instance.Length-1)).ToArray());
}

自己重新创建bitarray作为ulong[]
的包装器;以小于64的数字实现位移位是小菜一碟,与其他建议的方法相比,它将花费更少的时间,杀死更少的北极熊,如果您想保留它们,您可能必须增加数组(或者不增加,如果它们为零,并且您说不存在的元素隐式地保留零).

太好了……但是速度太慢了。我想应该有一种特殊的操作符或方法,因为我们在玩比特。你可以将内容从
比特数组
复制到
bool[]
中,然后将数据复制到另一个
bool[]
使用偏移量。最后,您可以从生成的
bool[]
重新创建
位数组。但我怀疑它会比访问~3000位的每个元素更快。有一点需要注意:“与整数原语的按位左移操作不同,LeftShift方法保留原始BigInteger值的符号。”因此(-3,原因是BigInteger类型是有符号的。OP要求左移。我喜欢这样,所以这里有一个左移版本:返回新的BitArray((instance.Cast().Take)(instance.Length-1).ToArray()).Concat(新bool[]{newState}).ToArray());确实如此。谢谢:)