繁体   English   中英

检查 C# BitArray 非零值的最快方法

[英]Fastest way to check C# BitArray for non-zero value

我试图快速检测 C# 中 BitArray 之间的冲突(使用 AND boolean 操作),这导致单个 BitArray 表示重叠区域。

显然,如果结果数组仅由零组成,则不会发生冲突。 检查这个的最快方法是什么? 简单的迭代太慢了。 我不关心碰撞在哪里,或者有多少——只关心数组中某处有一个非零值。

似乎应该有某种类似“将整个位数组转换为一个 int 值”的快速案例(具体来说是行不通的,因为 BitArray 的大小是可变的),但我想不出一个。

您是否需要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建议使用int代替BitArrays

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

以防万一有人仍在寻找一个不错的解决方案,因为这里缺少它:

Bitarrays 用零初始化,所以你可以简单地将一个新的 BitArray(相同长度)与你的两个 BitArrays 的 AND 结果进行比较(注意“,”。反转 bool .. :):

if (!new BitArray(bitCountOfResult).Equals(result)) {
    // We hit!
}

速度快,适合我。 确保避免使用 LINQ 方法,它非常慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM