C++ z阶曲线的下一次迭代

C++ z阶曲线的下一次迭代,c++,bit-manipulation,quadtree,octree,C++,Bit Manipulation,Quadtree,Octree,我正在使用中描述的技术构建四叉树。 我将坐标存储在二维或三维平移数组中 boost::array<unsigned int, 2 /* 3 */> coord; boost::数组协调; 我需要一个方法来计算下一个盒子的坐标。 它的工作原理是交织比特,增加一个比特,而不是去交织,但这会变得非常复杂。 我希望有一种类似于本文中的cmp_zorder(…)方法的实现,它可以在不交错位的情况下工作。好的,这里是“残缺”加法算法,x和y是输入和输出,并且假设交错坐标中的最低阶位是x(与中

我正在使用中描述的技术构建四叉树。 我将坐标存储在二维或三维平移数组中

boost::array<unsigned int, 2 /* 3 */> coord;
boost::数组协调;
我需要一个方法来计算下一个盒子的坐标。 它的工作原理是交织比特,增加一个比特,而不是去交织,但这会变得非常复杂。 我希望有一种类似于本文中的cmp_zorder(…)方法的实现,它可以在不交错位的情况下工作。

好的,这里是“残缺”加法算法,
x
y
是输入和输出,并且假设交错坐标中的最低阶位是
x
(与中相同)

int进位=1;
做
{
int newcarry=x&进位;
x^=进位;
进位=新进位;

newcarry=(y&carry)您到底想要什么?在Z顺序中紧靠(x,y)的(x',y'),但没有交错和反交错?完全正确,可能吗?当然,但我没有听说(也找不到)任何技巧,所以我能想到的唯一方法是修改按位加法算法,将进位添加到其他坐标(x中的进位应添加到y,y中的进位应添加到x)。一种类似的技术可以用于3D Z曲线。不过,我觉得这并不是特别快。你对这种方法感兴趣吗?是的,我很感兴趣,听起来像很多位运算
int carry = 1;
do
{
    int newcarry = x & carry;
    x ^= carry;
    carry = newcarry;
    newcarry = (y & carry) << 1;
    y ^= carry;
    carry = newcarry;
} while (carry != 0);