我有一个System.Collections.BitArray数组(约3000个项目),我想将所有位向左移动1位。但是,该集合似乎不支持该操作(即bitArray << 1不起作用,也没有方法)。有什么办法可以做到这一点吗?
谢谢!
这个简单的代码片段展示了一种手动的方法。将 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
我不确定效率如何,但这个扩展方法可以完成工作。
public static BitArray ShiftRight(this BitArray instance)
{
return new BitArray(new bool[] { false }.Concat(instance.Cast<bool>().Take(instance.Length - 1)).ToArray());
}
System.Numerics.BigInteger确实支持位移操作。
将bitarray重新创建为ulong[]
的包装器;通过这种方式实现比64小的数字的位移是易如反掌的,这样做需要的时间更少,杀死的北极熊也更少。要注意“会掉落的位”,如果您想保留它们,可能需要扩展数组(或者不需要,如果它们是零,并且您说不存在的元素隐式地保持为零)。
BitArray
的内容复制到一个bool[]
数组中,然后使用偏移量将数据复制到另一个bool[]
数组中,最后再从生成的bool[]
数组重新创建BitArray
。但是我怀疑这种方法对于大约3000位的数据访问并不比直接访问每个元素更快。 - Frank Bollack