我有一组键代码,其值为(当然是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);
会更有效率吗?
答案 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 &= 0xfffffffe
与x%=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];
}
}