2013-01-10 52 views
1

任何人都有挑戰?我正在尋找一種有效的算法來實現用最大值修復的數字的換行/溢出行爲。基於最大值的算法來包裝/溢出數

說,最大可能數目的值被定義爲:

#define MAX_NUMBER_VALUE 100 

和一個函數translate,需要一個符號的32位或64位整數值和「迴繞到它」使用MAX_NUMBER_VALUE常數:

int_fast8_t translate(int_fast32_t value) { 

    if (abs(value) > MAX_NUMBER_VALUE) { 
    return ...; // This! 
    } 

    return value; 
} 

預期的輸入和輸出:

translate(55) => 55 
translate(100) => 100 
translate(101) => -100 
translate(102) => -99 
translate(200) => -1 
translate(202) => 1 
translate(300) => 99 
translate(-40) => -40 
translate(-100) => -100 
translate(-101) => 100 
translate(-102) => 99 
translate(-200) => 1 
translate(-201) => 0 
... 

數值圍繞數字「行走」,好像它是一個圓形的行星。這看起來類似於C/C++如何處理int溢出條件。我想知道是否有一種快速有效的方法來實現這種包裝?與位移或其他按位操作一樣?

+3

你剛剛描述'%'運算符嗎? –

+1

你基本上需要做一個超過MAX_NUMBER_VALUE * 2 - 1的模... – Mysticial

回答

3
int_fast8_t translate(int_fast32_t value) { 
    return sgn(value)*((abs(value)+MAX)%(2*MAX+1)-MAX) 
} 

應該這樣做,假設爲int_fast32_t

編輯成包括負數的處理定義模塊劃分,但現在看起來有點混亂。對於智能實現SGN(x)的見this

+0

您確定要輸出的範圍爲_closed_間隔[-MAX_NUMBER_VALUE,MAX_NUMBER_VALUE]嗎?使用半開區間[-MAX_NUMBER_VALUE,MAX_NUMBER_VALUE)或(-MAX_NUMBER_VALUE,MAX_NUMBER_VALUE) – nrussell

+0

感謝,但我不認爲這將包裝負數,例如-101:'(-101+ 100)%(2 * 100 + 1)-100 = -101' – Sim

+0

當然,抱歉,我應該注意前面關於「謹慎處理負數」的評論 – nrussell

5

這聽起來像你只是描述了%算子,對負數進行了一些仔細的處理。

+2

你應該詳細說明這個「對負數進行仔細處理」 - 這是我相信問題的重要方面。我懷疑答案會是非常有用的。 – amit

+0

是的,我很清楚模數運算符在這裏很可能是不可避免的。不過,我想知道是否有任何替代方案與位移有關。 – Sim

+0

@Sim:對於MAX的任意值,並不是真的。你總是可以定義一個大規模的查找表,但由於可怕的緩存性能,這可能不會更快! –

0

只要你input + MAX_VALUE小於有問題的整體式的最大價值,我認爲你可以使用這個,甚至不需要初始abs檢查:

return ((input + MAX_VALUE) % (MAX_VALUE * 2 + 1)) - MAX_VALUE; 
+0

nrussell之前已經提出過這個問題,但是這並不包含負數,比如-101:'(-101 + 100)%(100 * 2 + 1)-100 = -101' – Sim