5

最初の関数は、[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)
{
    ????
}
4

1 に答える 1