将int更改为X和Y方向的最有效方法

时间:2015-01-26 15:54:22

标签: java performance coordinates

我有一组键代码,其值为(当然是mod 4),0到3对应于按键,向左,向上,向右的顺序。我需要将这些键码转换为x和y方向,正x表示原点左侧的位置,正y表示原点下方的位置。我看待它的方式,我有两种方法:

使用数组:

int [] dx = {0, -1, 0, 1};
int [] dy = {1, 0, -1, 0};
int x = dx[kc];
int y = dy[kc];

或使用算术:

int x = (kc%2)*(((kc/2)%2)*2 - 1);
int y = ((kc+1)%2)*(((kc/2)%2)*-2 + 1);

会更有效率吗?

4 个答案:

答案 0 :(得分:1)

这可能取决于语言。我认为整数表示会更有效。或者更好的是,如果你需要空间,你可以用位串表示方向。四个方向需要4位。大多数int是4个字节,是存储的8倍!然后,这可能不会影响任何事情,除非你存储了很多这些。

我会使用方向方法(getDirection(),setDirection()等)抽象出表示,然后尝试运行几种不同的程序。

编辑:woops,我的意思是让这个评论,而不是答案。对不起。

答案 1 :(得分:1)

分析将是你的朋友,但是,我会以不同的方式将你的常量分开。考虑:

private static final int[][] directions = {
    {0, 1},
    {-1, 0},
    {0, -1},
    {1, 0}
};

然后你可以这样做:

x = directions[kc][0];
y = directions[kc][1];

答案 2 :(得分:1)

首先,我不会真的担心这两种方法的效率,因为这种代码不太可能成为任何实际应用程序的瓶颈。但是,我认为第一种方法更具可读性。因此,如果您重视维护和调试时间,那就是最佳选择。

如果性能非常重要,并且这段代码至关重要,那么您应该对这两种方法进行基准测试。使用类似google caliper的内容。

其次,你可以通过用逻辑AND替换(有点慢)模数运算来优化第二种方法(x &= 0xfffffffex%=2相同只是更快,假设x是INT)。并使用逻辑左移替换乘法2(因此x <1而不是x * 2)。

答案 3 :(得分:0)

这是另一种转换方式。

package com.ggl.testing;

import java.awt.Point;

public class Convert {

    public Point convertDirection(int index) {
        // 0 to 3 corresponds to the keys down, left, up, right
        Point[] directions = { new Point(0, 1), new Point(-1, 0),
                new Point(0, -1), new Point(1, 0) };
        return directions[index];
    }

}