【问题标题】:How can this function be optimized这个功能如何优化
【发布时间】:2013-12-21 16:15:58
【问题描述】:

您好,我创建了这个函数,用于将游戏世界分成块。 每个块的大小为 32 个块。 该公式计算给定世界坐标的给定块编号的起始坐标。它工作得很好,但我认为可以优化它,但我不知道。该公式适用于负数,这一点很重要。

    static int wrld2chnk(int wrld)
    {
        if (wrld % 32 != 0)
        {
            if (wrld < 0)
                wrld -= (32 + wrld % 32);
            else
                wrld -= wrld % 32;
        }
        return wrld;
    }

// 这些是可用于验证结果的示例值。每个rpw中的第一个值是方法输入,第二个是输出:

    (0, 0);
    (31, 0);
    (32, 32);
    (33, 32);
    (-1, -32);
    (-31, -32);
    (-32, -32);
    (-33, -64);
    (-34, -64);
    (-64, -64);
    (-70, -96);

【问题讨论】:

  • 这和刚才wrld &amp; -32是一样的
  • 请验证我的解决方案是否有效..??

标签: math optimization integer


【解决方案1】:

首先,第一个if可以清楚地去。肯定的情况也适用于零:

static int wrld2chnk(int wrld)
{
    if (wrld < 0)
        wrld -= (32 + wrld % 32);
    else
        wrld -= wrld % 32;
    return wrld;
}

但它可以简单得多。您正在解决% 关心该标志的事实。向下舍入为 2 的幂的倍数要容易得多,只需使用按位 AND 与要向下舍入的 2 的幂的负数:

static int wrld2chnk(int wrld)
{
    return wrld & -32;
}

【讨论】:

    【解决方案2】:

    现在怎么样了,伙计们..??

    if(wrld>0)
    wrld = (wrld/32)*32;
    else
    wrld = ((wrld/32)-1)*32
    

    【讨论】:

    • OP 在这种情况下有wrld -= wrld % 32。这是如何改进的?
    • @DSM 它没有,它对负数舍入错误的方式,因此例如它将 -1 变为 0 而不是 -32
    • @harold:啊,我明白了。我在 Python 控制台上尝试时被优先级愚弄了。
    【解决方案3】:

    这是我的建议:

    int wrld2chnk (int wrld)
    {
      return sgn(wrld)*32*((32*(sgn(wrld)==-1)+abs(wrld))/32);
    }
    

    sgn(x) 在哪里:

    #define sgn(x) (((x)>=0)?1:-1)
    

    虽然如果你关心三元运算符(我就是喜欢它),这里你有一些 sgn() 的替代实现: Is there a standard sign function (signum, sgn) in C/C++?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      相关资源
      最近更新 更多