将矢量保存为单个数字
本文关键字:单个 数字 保存 | 更新日期: 2023-09-27 18:09:36
我想知道是否有可能获得X和Y值作为单个数字的向量,知道X和Y的范围可以从-65000到+65000。
这有可能吗?
关于如何从这种数字转换到它的代码示例将会很好。
保存在ulong
:
ulong rslt = (uint)x;
rslt = rslt << 32;
rslt |= ((uint)y);
把它取出来:
int x = (int)(rslt >> 32);
int y = (int)(rslt & 0xFFFFFFFF);
假设X
和Y
都是整数值并且没有溢出(32位值是不够的),您可以使用例如(伪代码)
V = fromXY(X, Y) = (y+65000)*130001+(x+65000)
(X,Y) = toXY(V) = (V%130001-65000,V/130001-65000) // <= / is integer division
(130001
为X
或Y
不同值的个数)
合并:
var limit = 65000;
var x = 1;
var y = 2;
var single = x * (limit + 1) + y;
然后:
y = single % (limit + 1);
x = single - y / (limit + 1);
实际操作
当然,您必须假设single
的最大值符合存储它的数据类型的大小(在本例中确实如此)。
联合可以很容易地完成您想要的操作。参见:http://www.cplusplus.com/doc/tutorial/other_data_types/
typedef long int64;
typedef int int32;
union {
struct { int32 a, b; };
int64 a_and_b;
} stacker;
int main ()
{
stacker.a = -1000;
stacker.b = 2000;
cout << stacker.a << ", " << stacker.b << endl;
cout << stacker.a_and_b << endl;
}
这将输出:
——a和b读为两个int32
——a和b被解释为单个int64