检查C#BitArray非零值

时间:2016-02-13 17:53:31

标签: c# arrays algorithm collision bitarray

我试图快速检测C#中BitArrays之间的冲突(使用AND布尔运算),这会导致一个BitArray表示重叠区域。

显然,如果生成的数组只包含零,则不会发生冲突。检查这个的最快方法是什么?简单的迭代太慢了。我不关心碰撞的位置,或者有多少碰撞 - 只是在阵列的某处有一个非零值。

似乎应该有某种快速的情况沿着"将整个位数组转换为int值" (由于BitArrays的大小可变,因此特别赢得了工作),但我无法解决这个问题。

1 个答案:

答案 0 :(得分:0)

您是否需要And()方法的结果BitArray?如果没有,你可以循环输入数组并在第一次碰撞时返回true。

bool collision(BitArray a1, BitArray a2) {
   if (a1 == null || a2 == null) throw new ArgumentException("arguments cannot be null");
   if (a1.Count != a2.Count) throw new ArgumentException("arrays don't have same length");
   for (int i = 0; i < a1.Count; i++)
       if (a1[i] && a2[i]) return true;

   return false;
}

这样你可以防止两次循环数组 - 即。一次用于And(),一次用于检查。平均而言,您只会遍历一次阵列的一半,因此最多可以加速4次。

另一种方式是。像@ itsme86建议使用ints而不是BitArrays

int a1, a2;
bool collision = (a1 & a2) > 0;