c# - 用一组 8 个 boolean 值找到正确组合的最快方法

标签 c# performance boolean combinations

我有一组 boolean 值:x1, y1, z1, x2, z2, x3, y3, z3 每个都是真或假。与其编写几十个 if 语句来检查正确的真/假组合,什么是发现真假正确组合的绝对最有效和最快的方法?:

if(x1 == true && y1 == true && z1 == true && 
   x2 == true && z2 == true && 
   x3 == true && y3 == true && z3 == true)
  {
    //do stuff if this is correct combination
  }
else if(x1 == false && y1 == true && z1 == true && 
   x2 == true && z2 == true && 
   x3 == true && y3 == true && z3 == true)
  {
    //do stuff if this is correct combination
  }
 //do on and so forth for the next few dozen lines to check combo's

我也在考虑使用 for 循环进行循环,但这似乎也很慢。这将每秒运行数十次,因此我正在努力使其尽可能高效。

编辑澄清:y2 是有意删除的。

我这样做的原因是因为我有如下网格:

x1, y1 ,z1
x2, y2 ,z2
x3, y3 ,z3

我试图找出 y2 周围的所有 boolean 值是否都设置为 true 或 false,因为应用于 y2 的纹理在每种情况下都会不同。例如,如果 x1、y1 和 z1 为假,其余为真,则 y2 纹理将设置为特定图像。如果 x3、z1 和 x2 为假,其余为真,则 y2 将再次设置为不同的图像。我正在尝试找出 y2 周围的哪些项目打开或关闭,以便我可以为 y2 设置正确的纹理。

最佳答案

把它转换成数字

x1 = 2^0 = 1
x2 = 2^1 = 2
x3 = 2^2 = 4
x4 = 2^3 = 8

例如你可以这样做:

int digit =
    (x1 ? 1 << 0 : 0) | (y1 ? 1 << 1 : 0) | (z1 ? 1 << 2 : 0) |
    (x2 ? 1 << 3 : 0) | (y2 ? 1 << 4 : 0) | (z2 ? 1 << 5 : 0) |
    (x3 ? 1 << 6 : 0) | (y3 ? 1 << 7 : 0) | (z3 ? 1 << 8 : 0);

或者使用BitArray:

BitArray bits = new BitArray(new[] {x1, y1, z1, x2, y2, z2, x3, y3, z3});
int[] array = new int[1];
bits.CopyTo(array, 0);
int digit = array[0];

这样你的组合:false, true, true, true, true 将是 01111,即 15 十进制

然后您可以将正确的组合存储为另一个数字,并简单地检查它们是否相等

关于c# - 用一组 8 个 boolean 值找到正确组合的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20490154/

相关文章:

c# - 如何将函数指针从 C# 传递到 C++ Dll?

c# - 将枚举绑定(bind)到 LINQ 和 SelectListItem

c - NUMA 架构上不同数据类型的 OpenMP 性能

java - boolean setter 错误输出

java - 为什么 indexof 对于在 java 中转换为列表的数组会失败?

c# - 十进制值不正确

c# - 为什么 yield return 不能出现在带有 catch 的 try block 中?

css - 实际表比。分区表

php - 从 PHP 数组中高效地挑选 n 个随机元素(无随机播放)

python - Pandas 根据连续重复创建新列