2D Morton 解码功能 64bits
Posted
技术标签:
【中文标题】2D Morton 解码功能 64bits【英文标题】:2D Morton decode function 64bits 【发布时间】:2015-08-14 03:04:59 【问题描述】:第一个函数将 [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的主要内容,如果未能解决你的问题,请参考以下文章
为 32 位、64 位和 128 位生成交错位模式(morton 密钥)