将矢量保存为单个数字?

时间:2011-09-24 15:04:36

标签: c# math

我想知道是否有可能将X和Y值的矢量作为单个数字,知道X和Y的范围都在-65000到+65000之间。

这有可能吗?

关于如何从这种数字转换到它的代码示例会很不错。

4 个答案:

答案 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)

假设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的不同值的数量

答案 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进行了间接