PostGIS  3.0.6dev-r@@SVN_REVISION@@

◆ uint32_hilbert()

static uint64_t uint32_hilbert ( uint32_t  px,
uint32_t  py 
)
inlinestatic

Definition at line 815 of file gbox.c.

816 {
817  uint64_t x = px;
818  uint64_t y = py;
819 
820  uint64_t A, B, C, D;
821 
822  // Initial prefix scan round, prime with x and y
823  {
824  uint64_t a = x ^ y;
825  uint64_t b = 0xFFFFFFFFULL ^ a;
826  uint64_t c = 0xFFFFFFFFULL ^ (x | y);
827  uint64_t d = x & (y ^ 0xFFFFFFFFULL);
828 
829  A = a | (b >> 1);
830  B = (a >> 1) ^ a;
831  C = ((c >> 1) ^ (b & (d >> 1))) ^ c;
832  D = ((a & (c >> 1)) ^ (d >> 1)) ^ d;
833  }
834 
835  {
836  uint64_t a = A;
837  uint64_t b = B;
838  uint64_t c = C;
839  uint64_t d = D;
840 
841  A = ((a & (a >> 2)) ^ (b & (b >> 2)));
842  B = ((a & (b >> 2)) ^ (b & ((a ^ b) >> 2)));
843  C ^= ((a & (c >> 2)) ^ (b & (d >> 2)));
844  D ^= ((b & (c >> 2)) ^ ((a ^ b) & (d >> 2)));
845  }
846 
847  {
848  uint64_t a = A;
849  uint64_t b = B;
850  uint64_t c = C;
851  uint64_t d = D;
852 
853  A = ((a & (a >> 4)) ^ (b & (b >> 4)));
854  B = ((a & (b >> 4)) ^ (b & ((a ^ b) >> 4)));
855  C ^= ((a & (c >> 4)) ^ (b & (d >> 4)));
856  D ^= ((b & (c >> 4)) ^ ((a ^ b) & (d >> 4)));
857  }
858 
859  {
860  uint64_t a = A;
861  uint64_t b = B;
862  uint64_t c = C;
863  uint64_t d = D;
864 
865  A = ((a & (a >> 8)) ^ (b & (b >> 8)));
866  B = ((a & (b >> 8)) ^ (b & ((a ^ b) >> 8)));
867  C ^= ((a & (c >> 8)) ^ (b & (d >> 8)));
868  D ^= ((b & (c >> 8)) ^ ((a ^ b) & (d >> 8)));
869  }
870 
871  {
872  uint64_t a = A;
873  uint64_t b = B;
874  uint64_t c = C;
875  uint64_t d = D;
876 
877  C ^= ((a & (c >> 16)) ^ (b & (d >> 16)));
878  D ^= ((b & (c >> 16)) ^ ((a ^ b) & (d >> 16)));
879  }
880 
881  // Undo transformation prefix scan
882  uint64_t a = C ^ (C >> 1);
883  uint64_t b = D ^ (D >> 1);
884 
885  // Recover index bits
886  uint64_t i0 = x ^ y;
887  uint64_t i1 = b | (0xFFFFFFFFULL ^ (i0 | a));
888 
889  return uint64_interleave_2(i0, i1);
890 }
static uint64_t uint64_interleave_2(uint64_t x, uint64_t y)
Definition: gbox.c:796

References uint64_interleave_2(), pixval::x, and pixval::y.

Referenced by gbox_get_sortable_hash().

Here is the call graph for this function:
Here is the caller graph for this function: