diff options
Diffstat (limited to 'src/curve.h')
| -rw-r--r-- | src/curve.h | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/curve.h b/src/curve.h new file mode 100644 index 0000000..dc003c1 --- /dev/null +++ b/src/curve.h @@ -0,0 +1,25 @@ +#ifndef CURVE_H +#define CURVE_H + +#include <limits.h> + +#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 |
