2017-02-15 530 views
0

我试图交织(为了计算莫顿代码)与值计算莫顿代码

壳体1 2签订长数字说xy(32位):

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

结果将是:

11001100 

壳体2:

x = -10; 
    y = 10; 

二进制表示是,

x = 1111111111111111111111111111111111111111111111111111111111110110 
y = 1010 

对于交织,我只考虑32位表示,其中i可以与y, 使用以下代码31位交织的x第31位,

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位。如果IAM错误,请更正我。

回答

0

我想下面的代码工作,根据您的要求,

莫顿码是64位,我们从两个32位数字的交织使64位数字。 由于数字签名的,我们要考虑负数的,

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. 
    } 

y同样做。

以下代码也交织,

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) 
    } 

我希望这有助于。:)