将矢量保存为单个数字

本文关键字:单个 数字 保存 | 更新日期: 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);

假设XY都是整数值并且没有溢出(32位值是不够的),您可以使用例如(伪代码)

V = fromXY(X, Y) = (y+65000)*130001+(x+65000)
(X,Y) = toXY(V) = (V%130001-65000,V/130001-65000)    // <= / is integer division

(130001XY不同值的个数)

合并:

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