[英]C# - What's the fastest way to convert a number to the smallest 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.