算法 – 如何计算3D Morton数(交织3个int的位)

我正在寻找一种快速的方法来计算一个3D Morton数。这个网站有一个魔术数字的伎俩做它的2D Morton数字,但它似乎不明显如何扩展到3D:http://www-graphics.stanford.edu/~seander/bithacks.html#InterleaveBMN

所以基本上我有3个10位数字,我想交织成一个单一的30位数与最小数量的操作。

您可以使用相同的技术。我假设变量包含32位整数,最高的22位设置为0(这是一个有点比必要的限制)。对于包含三个10位整数之一的每个变量x,我们执行以下操作:

x = (x | (x << 16)) & 0x030000FF;
x = (x | (x <<  8)) & 0x0300F00F;
x = (x | (x <<  4)) & 0x030C30C3;
x = (x | (x <<  2)) & 0x09249249;

然后,用x,y和z三个操作的10位整数,我们得到结果:

x | (y << 1) | (z << 2)

该技术工作的方式如下。上面的“分裂”位组的每一个x = …行,使得在其间具有足够的空间用于其它整数的位。例如,如果我们考虑三个4位整数,我们将一个与位1234分割为000012000034,其中零为其他整数保留。在下一步中,我们以相同的方式拆分12和34,以获得001002003004.即使10位不会使两组中的一个好的重复分区,你可以考虑它的16位,在那里你失去最高的。

正如你从第一行可以看到的,你实际上只需要为每个输入整数x,它认为x& 0x03000000 == 0。

http://stackoverflow.com/questions/1024754/how-to-compute-a-3d-morton-number-interleave-the-bits-of-3-ints

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:算法 – 如何计算3D Morton数(交织3个int的位)