位移错了值

时间:2014-01-22 18:18:12

标签: java

我有一个问题,我需要使用shift转换坐标,之后将它们转换回原始但不会返回相同的值(min,max值不能更改..)。

int x = 1000;
int y = -1000;

int minx = -294912; // can't be changed.
int miny = -262144; // can't be changed.

//Convert
int convertedX = x - minx >> 4;
int convertedY = y - miny >> 4;

//Convert back
int originalX = (convertedX << 4) + minx;
int originalY = (convertedY << 4) + miny;

System.out.println(originalX + " " + originalY + " - After Convert Back");

2 个答案:

答案 0 :(得分:3)

问题是你的班次实际上除以了16 ......所以你最终会失去信息。您不能精确地表示任何不能被16整除的值(即没有底部四位的值为0000。)

如果你不想丢失信息,就不能应用这种转变 - 就这么简单。

(我个人x - minx附近放置括号以使优先级明确。这实际上并没有引起你的问题,但除非人们已经学会了优先规则,否则代码目前尚不清楚。)

答案 1 :(得分:0)

当您向右移位4时,您将丢失信息。对于1000-1000的值,有1位 - 右起第4位 - 丢失

如果我将所有位移数量更改为3,或者如果我将xy都更改为16的倍数,则得到相同的值,以便最后4位全部为零没有信息丢失。