#ifndef CURVE_H #define CURVE_H #include #define BIT_OF(X, I) (((X) >> (I)) & 1ULL) static uintptr_t zorder(int x, int y) { uintptr_t z = 0; // interleaving bits results in a point on the z-order curve for (int i = 0; i < sizeof(x) * CHAR_BIT; i++) z |= (BIT_OF(x, i) << i*2) | (BIT_OF(y, i) << (i*2 + 1)); return z; } static void unzorder(uintptr_t z, int *x, int *y) { *x = 0; *y = 0; for (int i = 0; i < sizeof(z) * CHAR_BIT / 2; i++) { *x |= BIT_OF(z, i*2) << i; *y |= BIT_OF(z, i*2 + 1) << i; } } #undef BIT_OF #endif