2d код Мортона 64-битная функция декодирования
Первая функция кодирует [x, y] как 64-битный код Мортона, где x и y - 32-битные целые числа, использующие биты чередования по двоичным магическим числам.
Какая будет обратная функция?
void xy2d_morton_64bits(uint64_t x, uint64_t y, uint64_t *d)
{
x = (x | (x << 16)) & 0x0000FFFF0000FFFF;
x = (x | (x << 8)) & 0x00FF00FF00FF00FF;
x = (x | (x << 4)) & 0x0F0F0F0F0F0F0F0F;
x = (x | (x << 2)) & 0x3333333333333333;
x = (x | (x << 1)) & 0x5555555555555555;
y = (y | (y << 16)) & 0x0000FFFF0000FFFF;
y = (y | (y << 8)) & 0x00FF00FF00FF00FF;
y = (y | (y << 4)) & 0x0F0F0F0F0F0F0F0F;
y = (y | (y << 2)) & 0x3333333333333333;
y = (y | (y << 1)) & 0x5555555555555555;
*d = x | (y << 1);
}
void d2xy_morton_64bits(uint64_t d, uint64_t *x, uint64_t *y)
{
????
}
0 ответов
На этот вопрос ответили здесь.
Трещина d
затем в четные и нечетные числа используйте аналогичный набор сдвигов и масок, чтобы сжимать биты обратно вместе:
x = d&0x5555555555555555;
x = (x|x>>1)&0x3333333333333333; //converts 0a0b0c0d.. -> 00ab00cd...
x = (x|x>>2)&0x0f0f0f0f0f0f0f0f; //converts 00ab00cd.. -> 0000abcd...
//etc.