2013-10-18 43 views
1

可能非常容易的問題,但我出來這個看起來太複雜的實現...查找大於或等於x(正整數)的整數z(正整數,可能是2的冪)的最小整數

unsigned int x; 
unsigned int z; 
unsigned int makeXMultipleOfZ(const unsigned x, const unsigned z) { 
    return x + (z - x % z) % z; 
    //or 
    //return x + (z - (x + 1) % z - 1); //This generates shorter assembly, 
             //6 against 8 instructions 
} 
  • 我想避免if語句
  • 如果這能幫助我們可以肯定地說是Z將是2

電源在我的情況z=4(我硝酸鉀w我可以使用&位操作符替換模操作),並且我想知道是否可以使用包含更少步驟的實現。

+0

您認爲涉及多少個步驟?此外,這是四捨五入。 – sehe

+1

爲什麼你想要避免if語句,爲什麼你認爲你做的方式太「複雜」? – Dukeling

+0

我無法在任何地方找到這個主題,而且這似乎是一個簡單的操作,我希望可以實現更快的實現。 @Dickeling條件語句會使代碼更慢。 – Antonio

回答

2

如果z是二的冪,模運算可降低到這個位運算:

return (x + z - 1) & ~(z - 1);

這個邏輯數據結構邊界對齊很常見的,例如。這裏更多的信息:https://en.wikipedia.org/wiki/Data_structure_alignment

+0

正是!內存對齊是我的問題!上面的Eric Postpischil也有一個有趣的評論,無論如何,我的'z'在編譯時是已知的。 – Antonio

0

如果z二的冪和整數是無符號,下面的工作:

x + (z - 1) & ~(z - 1) 

使用我想不出解決的位變換如果Z爲任意數。

+1

'〜(z-1)'是'-z'(無符號或二進制補碼)。儘管優化器可能會將第二個實例作爲常見的子表達式消除。 –

+0

@MadScientist我認爲你放置圓括號的方式令人困惑:無論如何,'&'是最後一個要執行的操作。如果不是這樣,你的解決方案將是不正確的。 – Antonio