我有一个问题,我需要使用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");
答案 0 :(得分:3)
问题是你的班次实际上除以了16 ......所以你最终会失去信息。您不能精确地表示任何不能被16整除的值(即没有底部四位的值为0000。)
如果你不想丢失信息,就不能应用这种转变 - 就这么简单。
(我个人还在x - minx
附近放置括号以使优先级明确。这实际上并没有引起你的问题,但除非人们已经学会了优先规则,否则代码目前尚不清楚。)
答案 1 :(得分:0)
当您向右移位4时,您将丢失信息。对于1000
和-1000
的值,有1位 - 右起第4位 - 丢失
如果我将所有位移数量更改为3,或者如果我将x
和y
都更改为16的倍数,则得到相同的值,以便最后4位全部为零没有信息丢失。