一种简短且具有数学意义的方法来检查只有一个变量不是0

Ben*_*eri 3 java variables vector

我有一个给定的方法Direction calculateDirection(Vector3 from, Vector3 to) ,其中Vector3包含X,Y,Z.

该方法的目的是计算直线方向,它不能是对角线,它只能是X_LEFTX_RIGHT,或Z_LEFT,或Z_RIGHTTOPDOWN.

所以我开始得到补偿:

Direction calculateDirection(Vector3 from, Vector3 to) {
    int x = from.getX() - to.getX();
    int y = from.getY() - to.getY();
    int z = from.getZ() - to.getZ();
}
Run Code Online (Sandbox Code Playgroud)

所以要知道方向,其中一个变量不应该是0,如果有多个变量不是0,我需要返回null或抛出一个exception.

要做到这一点,我需要执行一些if,elseif但我对此感到不舒服,我觉得可以有一个更简单的数学解决方案.

例如,如果x不是0那么我可以检查它是否为负,如果是,那么它X_LEFT.

我想补充一点,X,Y,Z可以是-1,0或1.

And*_*eas 7

看来你不仅要验证只有一个不是零,而且你实际上需要确定一个Direction值.

由于价值x只能是-1,0或者1,如果你增加1你得到的x可能0,1或者2,这将适合2位.如果您为yz移动它们并执行相同操作,则可以将所有3组合成单个int值.

从技术上讲,你只需要移动2来防止比特重叠,但为了清楚起见,我们将移动y4和z8,所以它们每个都在一个单独的半字节中.

switch ((x + 1) | ((y + 1) << 4) | ((z + 1) << 8)) {
    case 0x110: return Direction.X_LEFT;  // x == -1, y ==  0, z ==  0
    case 0x112: return Direction.X_RIGHT; // x ==  1, y ==  0, z ==  0
    case 0x101: return Direction.DOWN;    // x ==  0, y == -1, z ==  0
    case 0x121: return Direction.TOP;     // x ==  0, y ==  1, z ==  0
    case 0x011: return Direction.Z_LEFT;  // x ==  0, y ==  0, z == -1
    case 0x211: return Direction.Z_RIGHT; // x ==  0, y ==  0, z ==  1
    default:    return null;              // other invalid combination
}
Run Code Online (Sandbox Code Playgroud)

这种位操作是否满足您对"简单数学解决方案"的需求?