2015-05-31 29 views
0

第一個函數將[x,y]編碼爲64位寬Morton代碼,其中x和y是32位寬整數,使用交錯位由二進制幻數組成。2D Morton解碼函數64位

什麼是相反的功能?

void xy2d_morton_64bits(uint64_t x, uint64_t y, uint64_t *d) 
{ 
    x = (x | (x << 16)) & 0x0000FFFF0000FFFF; 
    x = (x | (x << 8)) & 0x00FF00FF00FF00FF; 
    x = (x | (x << 4)) & 0x0F0F0F0F0F0F0F0F; 
    x = (x | (x << 2)) & 0x3333333333333333; 
    x = (x | (x << 1)) & 0x5555555555555555; 

    y = (y | (y << 16)) & 0x0000FFFF0000FFFF; 
    y = (y | (y << 8)) & 0x00FF00FF00FF00FF; 
    y = (y | (y << 4)) & 0x0F0F0F0F0F0F0F0F; 
    y = (y | (y << 2)) & 0x3333333333333333; 
    y = (y | (y << 1)) & 0x5555555555555555; 

    *d = x | (y << 1); 
} 

void d2xy_morton_64bits(uint64_t d, uint64_t *x, uint64_t *y) 
{ 
    // ???? 
} 
+1

第一功能將無法正常工作。你顯然混淆了指針和值。你的編譯器至少應該明確地警告(int-ops on pointer)。另外,爲什麼不直接返回結果?什麼是「功能」? – Olaf

+0

此前提出問題http://stackoverflow.com/questions/4909263/how-to-efficiently-de-interleave-bits-inverse-morton的 –

+0

可能重複的[2D莫頓碼編碼/解碼64bits的](HTTP://計算器的.com /問題/ 30539347/2D-莫頓 - 編碼 - 編碼 - 解碼-64位)。 @WeatherVane:在最後幾天他問了同樣的問題。 – Olaf

回答

3
void xy2d_morton(uint64_t x, uint64_t y, uint64_t *d) 
{ 
    x = (x | (x << 16)) & 0x0000FFFF0000FFFF; 
    x = (x | (x << 8)) & 0x00FF00FF00FF00FF; 
    x = (x | (x << 4)) & 0x0F0F0F0F0F0F0F0F; 
    x = (x | (x << 2)) & 0x3333333333333333; 
    x = (x | (x << 1)) & 0x5555555555555555; 

    y = (y | (y << 16)) & 0x0000FFFF0000FFFF; 
    y = (y | (y << 8)) & 0x00FF00FF00FF00FF; 
    y = (y | (y << 4)) & 0x0F0F0F0F0F0F0F0F; 
    y = (y | (y << 2)) & 0x3333333333333333; 
    y = (y | (y << 1)) & 0x5555555555555555; 

    *d = x | (y << 1); 
} 

// morton_1 - extract even bits 

uint64_t morton_1(uint64_t x) 
{ 
    x = x & 0x5555555555555555; 
    x = (x | (x >> 1)) & 0x3333333333333333; 
    x = (x | (x >> 2)) & 0x0F0F0F0F0F0F0F0F; 
    x = (x | (x >> 4)) & 0x00FF00FF00FF00FF; 
    x = (x | (x >> 8)) & 0x0000FFFF0000FFFF; 
    x = (x | (x >> 16)) & 0xFFFFFFFFFFFFFFFF; 
    return x; 
} 

void d2xy_morton(uint64_t d, uint64_t *x, uint64_t *y) 
{ 
    *x = morton_1(d); 
    *y = morton_1(d >> 1); 
}