如何优化此功能

时间:2013-12-21 16:15:58

标签: math optimization integer

您好我创建了这个功能,用于将游戏世界分成块。 每个块大小为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);

3 个答案:

答案 0 :(得分:5)

首先,第一个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;
}

答案 1 :(得分:0)

现在家伙怎么样???

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

答案 2 :(得分:0)

这是我的建议:

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++?