Сохранить вектор как одно число? - PullRequest
1 голос
/ 24 сентября 2011

Мне было интересно, можно ли получить вектор со значениями X и Y как одно число, зная, что и X, и Y могут находиться в диапазоне от -65000 до + 65000.

Возможно ли это как-нибудь?

Примеры кода о том, как конвертировать из этого вида числа и в него было бы неплохо.

Ответы [ 4 ]

2 голосов
/ 24 сентября 2011

Храните в ulong:

ulong rslt = (uint)x;
rslt = rslt << 32;
rslt |= ((uint)y);

Чтобы получить:

int x = (int)(rslt >> 32);
int y = (int)(rslt & 0xFFFFFFFF);
1 голос
/ 24 сентября 2011

Предполагая, что 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)

1 голос
/ 24 сентября 2011

Для объединения:

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 соответствует размеру типа данных, в котором он хранится (что в данном случае и так).

0 голосов
/ 24 сентября 2011

союз делает то, что вы хотите очень легко. Смотрите также: http://www.cplusplus.com/doc/tutorial/other_data_types/

</p>

<pre><code>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 <- a и b читаются как два int32 <br> 8594229558296 <- a и b интерпретируются как один int64 <br>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...