【问题标题】:Counting with booleans用布尔值计数
【发布时间】:2012-05-29 22:30:05
【问题描述】:

我想知道是否可以像数字一样将布尔值相加。我正在制作使用网格的东西,我希望它找到周围的正方形并返回一个数字。 编辑: 这就是我计算布尔值的方式。

 int count = 0;
 for (int x = -1; x<=1;x++){
   for (int y = -1; y <=1;y++){
     if (grid[xPos+x][yPos+y]){
        count++;
     }
   }
 }

【问题讨论】:

  • 布尔值如何计算?请举个例子
  • 这不是康威的人生游戏吧?
  • 不要忘记不计算中心位置,当 x == 0 和 y == 0 时,除非您确定要这样做。此外,您是否需要检查 x max X 或 y > max Y 的边缘条件?

标签: java boolean


【解决方案1】:
boolean[] bools = ...
int sum = 0;
for(boolean b : bools) {
    sum += b ? 1 : 0;
}

这假设您希望 true 成为 1false 成为 0

【讨论】:

  • @HovercraftFullOfEels 是的,但我正在修改它,以便人们可以调整规则。
【解决方案2】:

要补充 Jeffrey 的答案,请不要忘记:

  • 如果您位于嵌套 for 循环的中心单元格,请不要检查网格,也不要添加到计数中。否则,您将在其邻居计数中计算单元格本身。在你的情况下,它是(x == 0 &amp;&amp; y == 0)
  • 您需要检查单元格是否在边缘,如果是,请确保您没有尝试计算不在网格上的单元格。我已经使用类似这样的方法完成了此操作:int xMin = Math.max(cellX - 1, 0); 其中 xMin 是 for 循环之一的下限。我对 y 做类似的事情,对网格的最大边也做类似的事情。在您的代码中,当 xPos + x &lt; 0xPos + x &gt;= MAX_X(MAX_X 是网格允许的最大 x 值的常数)时会发生这种情况,并且对于事物的 y 侧也是如此。

【讨论】:

    【解决方案3】:

    你的目标是什么?速度?可读性?代码简洁?

    如果您追求速度,请考虑尽量减少内存访问次数。如果您可以强制将布尔值存储为位,则可以使用 >> 和 & 仅比较每行中您关心的位。也许是这样的:

     byte grid[m][n / 8];
    
     int neighbor_count = 0;
     for (int row = yPos - 1; row < yPos + 1; row++) {
       // calculate how much to shift the bits over.
       int shift = 5 - (xPos - 1 % 8);
       if (shift > 0) {
         // exercise for the reader - span bytes.
       } else {
         // map value of on-bits to count of on bits
         static byte count[8] = [0, 1, 1, 2, 1, 2, 2, 3];
         // ensure that only the lowest 3 bits are on.
         low3 = (grid[row][xPos / 8] >> shift) & 7;
         // look up value in map
         neighbor_count += count[low3];
       }
    

    警告编码器:这是未经测试的,仅用于说明。它也不包含边界检查:一种解决方法是从 1 迭代到 max - 2 并具有未设置单元格的边界。如果正在评估的单元格打开,您也应该减去 1。

    这最终可能会比您拥有的要慢。您可以通过将位图存储在 int32s(或任何本机)中来进一步优化它。你也可以使用多线程,或者只实现Hashlife :)

    显然,这优化了简洁可读性。我认为您的代码具有最大的可读性。

    正如 Jeffrey 所暗示的,存储一个稀疏的“on”布尔数组可能比值数组更可取,具体取决于您在做什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-29
      • 2015-05-23
      • 2017-07-30
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 2017-04-08
      • 1970-01-01
      相关资源
      最近更新 更多