Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
unsigned long decodeIndex( const unsigned long index ) {
unsigned long ind = index & 0x0249249249249249;
ind=((ind*0x10000100001)>>40);
return DecodeTable[(int)ind&0xFFFFF];
}
000000
|
================================================
000000 001000 010000 011000 100000 101000 111000
|
=======================================================
010000 010001 010010 010011 010100 010101 010110 010111
000000
|
=======================================================
000000 001000 010000 011000 100000 101000 110000 111000
|
=======================================================
010000 010001 010010 010011 010100 010101 010110 010111
Итого на структуру дерева — 39 бит (против 60 в вашем примере) плюс 606 бит на уточнение координат.
typedef unsigned int uint;
typedef unsigned char byte;
void Process(byte *T,int depth){
Process(T,0,0,0,1u<<depth);
}
byte *Process(byte *T,uint x,uint y,uint z,uint level){
byte mask=*T++;
level>>=1;
for(int k=0;k<8;k++){
uint x1=x+level*(k&1),y1=y+level*((k>>1)&1),z1=z+level*((k>>2)&1);
if(mask&1) T=Process(T,x1,y1,z1,level);
else ProcessList(x1,y1,z1,level);
mask>>=1;
}
return T;
}
unsigned char x; // Interleave bits of (8-bit) x and y, so that all of the
unsigned char y; // bits of x are in the even positions and y in the odd;
unsigned short z; // z gets the resulting 16-bit Morton Number.
z = ((x * 0x0101010101010101ULL & 0x8040201008040201ULL) *
0x0102040810204081ULL >> 49) & 0x5555 |
((y * 0x0101010101010101ULL & 0x8040201008040201ULL) *
0x0102040810204081ULL >> 48) & 0xAAAA;
Линейное представление октодерева с использованием кода Мортона