我想知道是否有可能将X和Y值的矢量作为单个数字,知道X和Y的范围都在-65000到+65000之间。
这有可能吗?
关于如何从这种数字转换到它的代码示例会很不错。
答案 0 :(得分:2)
将其存储在ulong
:
ulong rslt = (uint)x;
rslt = rslt << 32;
rslt |= ((uint)y);
要解决这个问题:
int x = (int)(rslt >> 32);
int y = (int)(rslt & 0xFFFFFFFF);
答案 1 :(得分:1)
结合使用:
var limit = 65000;
var x = 1;
var y = 2;
var single = x * (limit + 1) + y;
然后:
y = single % (limit + 1);
x = single - y / (limit + 1);
<强> See it in action 强>
当然,您必须假设single
的最大值符合存储它的数据类型的大小(在这种情况下它是这样)。
答案 2 :(得分:1)
假设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
的不同值的数量
答案 3 :(得分:-3)
工会很容易做你想做的事。 另见: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;
}
这将输出:
-1000,2000&lt; -a和b读作两个int32
8594229558296&lt; -a和b作为单一的int64进行了间接