我有一个 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
将其作为扩展方法应该没什么大不了的。
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());
}
自己重新创建位数组作为包装器ulong[]
;以这种方式实现小于 64 的数字移位是小菜一碟,与其他建议的方法相比,它将花费更少的时间并杀死更少的北极熊。通过警惕“最终会落下的位”,如果你想保留它们,你可能必须增加数组(或者不是,如果它们为零并且你说不存在的元素隐含地保持为零)。
我想到的最简单的方法是将 BitArray 转换为 BigInt 或支持按位移位和返回的类似结构。现在,我认为.Net 4 中内置的 BigInteger 不支持移位,但还有其他支持,例如 Mono 的实现。