如何以“显而易见的方式”去交错位(un-Mortonize)? (3D)

问题描述 投票:0回答:0

我知道一个similar question已经被问过。但是,我在操作位时遇到了一些麻烦,无法适应/理解解决方案。

首先,我使用 Interleave 位以明显的方式 为自己获取莫顿数。我把它改编成 3D 是这样的:

unsigned long xyz2w(unsigned int x, unsigned int y, unsigned int z)
{
    unsigned long w=0;

    for (int i = 0; i < sizeof(x) * CHAR_BIT; i++)
    {
        w |= (x & 1U << i) << i | (y & 1U << i) << (i + 1) | (z & 1U << i) << (i + 2);
    }

    return w;
}

(它似乎工作正常,但如果您发现错误,请告诉我)

现在我想做相反的操作。即:根据莫顿数提取3个坐标

很明显,我尝试使用了之前SO题目中的adapted-for-3D部分,但是没看懂它是如何工作的。这就是为什么我要创建一个新主题。

我不是在寻找高性能代码,而是在寻找类似于 xyz2w 函数(即“显而易见的方式”)的清晰易懂的代码。

c binary bit-manipulation bit
© www.soinside.com 2019 - 2024. All rights reserved.