2017-02-15 7 views
0
나 인터리브 애 쓰고

모튼 코드

케이스 (1)과 (2)는 긴 숫자 xy (32 비트)라고 서명 (모튼 코드를 계산) 계산 :

x = 10; //1010 
y = 10; //1010 

결과가 될 것이다

11001100 

경우 2 :

x = -10; 
    y = 10; 
,369 1,363,210

이진 표현은 인터리빙

x = 1111111111111111111111111111111111111111111111111111111111110110 
y = 1010 

는 난 다음 코드를 사용 y, 31 비트로 x 31 비트를 인터리빙 할 32 비트 표현을 고려하고,이다

signed long long x_y; 
for (int i = 31; i >= 0; i--) 
     { 

        unsigned long long xbit = ((unsigned long) x)& (1 << i); 
        x_y|= (xbit << i); 

        unsigned long long ybit = ((unsigned long) y)& (1 << i); 

        if (i != 0) 
        { 
           x_y|= (x_y<< (i - 1)); 
        } 
        else 
        { 
           (x_y= x_y<< 1) |= ybit; 
        } 
     } 

우리가 x 양수 및 y 음수이지만 케이스 2가 실패하면 위의 코드가 제대로 작동합니다. 제발 도와주세요, 무슨 일 이니? 음수는 64 비트를 사용하는 반면, 양수는 32 비트를 사용합니다. 잘못된 경우 저를 고칩니다.

답변

0

내가 귀하의 요구 사항에 따라 코드가 작동 아래 생각,

모튼 코드는 64 비트이며 우리는 인터리빙에 의해 두 개의 32 비트 숫자에서 64 비트 숫자를하고 있습니다. 번호가 서명 때문에, 우리는 유사 y에 대한

if (x < 0) //value will be represented as 2's compliment,hence uses all 64 bits 
    { 
     value = x; //value is of 32 bit,so use only first lower 32 bits 
     cout << value; 
     value &= ~(1 << 31); //make sign bit to 0,as it does not contribute to real value. 
    } 

을, 같은 음수를 고려해야합니다.

다음 코드는,

unsigned long long x_y_copy = 0; //make a copy of ur morton code 
//looping for each bit of two 32 bit numbers starting from MSB. 
    for (int i = 31; i >=0; i--) 
    { 
     //making mort to 0,so because shifting causes loss of data 
     mort = 0; 
     //take 32 bit from x 
     int xbit = ((unsigned long)x)& (1 << i); 
     mort = (mort |= xbit)<<i+1; /*shifting*/ 
     //copy formed code to copy ,so that next time the value is preserved for appending 
     x_y_copy|= mort; 
     mort =0; 
     //take 32nd bit from 'y' also 
     int ybit = ((unsigned long)y)& (1 << i); 
     mort = (mort |= ybit)<<i; 
     x_y_copy |= mort; 
    } 
    //this is important,when 'y' is negative because the 32nd bit of 'y' is set to 0 by above first code,and while moving 32 bit of 'y' to morton code,the value 0 is copied to 63rd bit,which has to be made to 1,as sign bit is not 63rd bit. 
    if (mapu_y < 0) 
    { 
     x_y_copy = (x_y_copy) | (4611686018427387904);//4611686018427387904 = pow(2,63) 
    } 

나는이 도움이 인터리빙 희망한다. :)