5

The first function encodes [x, y] as 64bit wide Morton code where x and y are 32bit wide integers using Interleave bits by Binary Magic Numbers.

What would be the reverse function ?

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)
{
    ????
}
Paul R
  • 208,748
  • 37
  • 389
  • 560
Dawid Szymański
  • 775
  • 6
  • 15

1 Answers1

0

This question was answered here.

Split d into evens and odds then use a similar set of shifts and masks to compress the bits back together:

x = d&0x5555555555555555;
x = (x|x>>1)&0x3333333333333333;   //converts 0a0b0c0d.. -> 00ab00cd...
x = (x|x>>2)&0x0f0f0f0f0f0f0f0f;   //converts 00ab00cd.. -> 0000abcd...
//etc.
AShelly
  • 34,686
  • 15
  • 91
  • 152