2013-12-21 121 views
1

嗨我已經創建了這個功能,用於將遊戲世界分成塊。 每塊大小爲32塊。 該公式計算給定世界座標的給定塊編號的起始座標。它運作良好,但我認爲可以優化它,但我不知道。該公式與負數一起使用非常重要。如何優化這個功能

static int wrld2chnk(int wrld) 
    { 
     if (wrld % 32 != 0) 
     { 
      if (wrld < 0) 
       wrld -= (32 + wrld % 32); 
      else 
       wrld -= wrld % 32; 
     } 
     return wrld; 
    } 

//這些是可用於驗證結果的示例值。在每個RPW的第一個值是方法輸入,第二個是輸出:

(0, 0); 
    (31, 0); 
    (32, 32); 
    (33, 32); 
    (-1, -32); 
    (-31, -32); 
    (-32, -32); 
    (-33, -64); 
    (-34, -64); 
    (-64, -64); 
    (-70, -96); 
+2

這就和'wrld&-32' – harold

+0

一樣請驗證我的解決方案是否工作。 – Jimmy

回答

5

首先,第一個if可以清楚地去。正面的情況也適用於零:

static int wrld2chnk(int wrld) 
{ 
    if (wrld < 0) 
     wrld -= (32 + wrld % 32); 
    else 
     wrld -= wrld % 32; 
    return wrld; 
} 

但它可以更簡單。你正在解決%關注標誌的事實。四捨五入到二的冪的倍數是非常容易,只需使用位與,2,你捨去到電源的負極:

static int wrld2chnk(int wrld) 
{ 
    return wrld & -32; 
} 
0

現在如何球員..?

if(wrld>0) 
wrld = (wrld/32)*32; 
else 
wrld = ((wrld/32)-1)*32 
+0

對於這種情況,OP有'wrld - = wrld%32'。這是如何改進的? – harold

+0

@DSM它沒有,它對負數進行了錯誤的處理,例如它將-1變爲0而不是-32 – harold

+0

@harold:啊,我明白了。當我在Python控制檯上嘗試時,我被優先級愚弄了。 – DSM

0

這裏是我的建議:

int wrld2chnk (int wrld) 
{ 
    return sgn(wrld)*32*((32*(sgn(wrld)==-1)+abs(wrld))/32); 
} 

其中sgn(x)是:

#define sgn(x) (((x)>=0)?1:-1) 

但如果你所關心的三元運算符(我喜歡),在這裏你有0123的一些替代實現: Is there a standard sign function (signum, sgn) in C/C++?