位数组 - 位移操作

7

我有一个System.Collections.BitArray数组(约3000个项目),我想将所有位向左移动1位。但是,该集合似乎不支持该操作(即bitArray << 1不起作用,也没有方法)。有什么办法可以做到这一点吗?

谢谢!

6个回答

6

这个简单的代码片段展示了一种手动的方法。将 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

将其作为扩展方法并不是什么大问题。

3
好的,但速度有些慢。我原以为会有一种特殊的运算符或方法,因为我们在处理位(bit)。 - Martin
你可以通过将BitArray的内容复制到一个bool[]数组中,然后使用偏移量将数据复制到另一个bool[]数组中,最后再从生成的bool[]数组重新创建BitArray。但是我怀疑这种方法对于大约3000位的数据访问并不比直接访问每个元素更快。 - Frank Bollack

2

我不确定效率如何,但这个扩展方法可以完成工作。

public static BitArray ShiftRight(this BitArray instance)
{
    return new BitArray(new bool[] { false }.Concat(instance.Cast<bool>().Take(instance.Length - 1)).ToArray());
}

1
OP 要求进行左移操作。我很喜欢这个想法,所以这里提供一个左移版本: 返回新的 BitArray( (instance.Cast<bool>().Take(instance.Length - 1).ToArray()).Concat(new bool[] { newState }).ToArray() ); - xgo
确实。谢谢 :) - eye

2

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


1
有一个例外:“与整型基元使用的按位左移操作不同,LeftShift方法保留原始BigInteger值的符号。” 因此,(-3 << 30)!= ((BigInteger)(-3) << 30) - FarmerBob
这是因为BigInteger类型是有符号的。 - detay

1

1

将bitarray重新创建为ulong[]的包装器;通过这种方式实现比64小的数字的位移是易如反掌的,这样做需要的时间更少,杀死的北极熊也更少。要注意“会掉落的位”,如果您想保留它们,可能需要扩展数组(或者不需要,如果它们是零,并且您说不存在的元素隐式地保持为零)。


0
我脑海中最简单的方法是将BitArray转换为BigInt或类似支持位移的结构,然后再转回来。现在,在.Net 4中内置的BigInteger好像不支持位移,但是有其他支持位移的实现,比如Mono的实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接