How to compute a 3D Morton number (interleave the bits of 3 ints)

后端 未结 9 2143
旧巷少年郎
旧巷少年郎 2020-11-29 18:26

I\'m looking for a fast way to compute a 3D Morton number. This site has a magic-number based trick for doing it for 2D Morton numbers, but it doesn\'t seem obvious how to e

9条回答
  •  谎友^
    谎友^ (楼主)
    2020-11-29 18:48

    I took the above and modified it to combine 3 16-bit numbers into a 48- (really 64-) bit number. Perhaps it will save someone the small bit of thinking to get there.

    #include 
    #include 
    uint64_t zorder3d(uint64_t x, uint64_t y, uint64_t z){
         static const uint64_t B[] = {0x00000000FF0000FF, 0x000000F00F00F00F,
                                        0x00000C30C30C30C3, 0X0000249249249249};           
         static const int S[] =  {16, 8, 4, 2}; 
         static const uint64_t MAXINPUT = 65536;
    
         assert( ( (x < MAXINPUT) ) && 
          ( (y < MAXINPUT) ) && 
          ( (z < MAXINPUT) )
         );
    
         x = (x | (x << S[0])) & B[0];
         x = (x | (x << S[1])) & B[1];
         x = (x | (x << S[2])) & B[2];
         x = (x | (x << S[3])) & B[3];
    
         y = (y | (y << S[0])) & B[0];
         y = (y | (y << S[1])) & B[1];
         y = (y | (y << S[2])) & B[2];
         y = (y | (y << S[3])) & B[3];
    
         z = (z | (z <<  S[0])) & B[0];
         z = (z | (z <<  S[1])) & B[1];
         z = (z | (z <<  S[2])) & B[2];
         z = (z | (z <<  S[3])) & B[3];
    
         return ( x | (y << 1) | (z << 2) );
        }
    

提交回复
热议问题