【发布时间】:2016-02-21 03:31:22
【问题描述】:
我有一个 System.Collections.BitArray 数组(约 3000 个项目),我想将所有位向左移动 1。但是该集合似乎不支持该操作(即 bitArray
谢谢!
【问题讨论】:
我有一个 System.Collections.BitArray 数组(约 3000 个项目),我想将所有位向左移动 1。但是该集合似乎不支持该操作(即 bitArray
谢谢!
【问题讨论】:
自己重新创建位数组作为ulong[] 的包装器;以这种方式实现小于 64 的数字移位是小菜一碟,与其他建议的方法相比,这将花费更少的时间并杀死更少的北极熊。通过警惕“最终会落下的位”,如果您想保留它们,您可能必须增加数组(或者不增加,如果它们为零并且您说不存在的元素隐含地保持为零)。
【讨论】:
我不确定效率如何,但这种扩展方法可以完成这项工作
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 转换为支持按位移位和返回的 BigInt 或类似结构。现在,我认为 .Net 4 中内置的 BigInteger 不支持移位,但还有其他支持,例如 Mono 的实现。
【讨论】:
这个简单的 sn-p 显示了一种手动方法。 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 复制到bool[],然后使用偏移量将数据复制到另一个bool[]。最后,您可以从生成的bool[] 重新创建您的BitArray。但我怀疑它会比访问每个元素的约 3000 位更快。