2D Morton 解码功能 64bits

Posted

技术标签:

【中文标题】2D Morton 解码功能 64bits【英文标题】:2D Morton decode function 64bits 【发布时间】:2015-08-12 23:05:39 【问题描述】:

第一个函数将 [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)

    // ????

【问题讨论】:

第一个函数不起作用。您显然混淆了指针和值。您的编译器至少应该明确警告(指针上的 int-ops)。另外,为什么不直接返回结果呢? function 是什么? 上一个问题***.com/questions/4909263/… 2D morton code encode/decode 64bits 的可能副本。 @WeatherVane:他在过去几天内三次问过同样的问题。 :) 奥拉夫——你当然是对的。对不起。匆忙将javascript代码与c混合时犯了错误。事实上,它甚至不是我的代码,而是从我之前的帖子中借来的。已经编辑好了。但是这个问题仍然没有答案...... 没错,我问的是同样的问题,或者至少是同样的问题,因为找不到答案。请帮忙。 【参考方案1】:
void xy2d_morton(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);


// morton_1 - extract even bits

uint64_t morton_1(uint64_t x)

    x = x & 0x5555555555555555;
    x = (x | (x >> 1)) & 0x3333333333333333;
    x = (x | (x >> 2)) & 0x0F0F0F0F0F0F0F0F;
    x = (x | (x >> 4)) & 0x00FF00FF00FF00FF;
    x = (x | (x >> 8)) & 0x0000FFFF0000FFFF;
    x = (x | (x >> 16)) & 0xFFFFFFFFFFFFFFFF;
    return x;


void d2xy_morton(uint64_t d, uint64_t *x, uint64_t *y)

    *x = morton_1(d);
    *y = morton_1(d >> 1);

【讨论】:

以上是关于2D Morton 解码功能 64bits的主要内容,如果未能解决你的问题,请参考以下文章

2d Morton 码 64bits 解码功能

2D morton 代码编码/解码 64 位

为 32 位、64 位和 128 位生成交错位模式(morton 密钥)

base64编码解码原理

解码 8bit 邮件消息:Content-Transfer-Encoding: 8bit

Base64编解码是什么?