2012-11-25 56 views
12

我想知道如何通過僅使用位移或位運算符將整數除以另一個整數(均爲正數)來獲得餘數。不應使用/運營商或%運營商。移位以獲取餘數

例如,爲了獲得除數的形式爲2^k的餘數,以下操作會得出餘數。

m = Remainder

n = The number

d = The divisor

m = n & (d - 1)

然而,該方法僅當d的形式2^k的。我想知道2的非權力類似的方法。我目前working上一個problem從programming challenges並希望採用這樣一個方法來減小程序的執行時間

+1

難道只有在base-2中的位表示是一個限制嗎?考慮價值43/7 - 價值實際上是6.142857 ...。你認爲基礎值高於2的通用方法? – Makoto

+5

沒有一般的方法。不過,如果您知道除數,則可以用乘法和一些移位和加/減來代替該除法。詢問任何有能力的C編譯器,它會給你任何編譯時常量的魔法值。 –

+0

除非答案只涉及1位移位聲明,否則我敢打賭你不會擊敗javas mod運算符。 – goat

回答

1

這也不能使用operator %將be不太efficient answer有答覆,但如果你absolutely不能使用運營商,那麼,一個解決方案是使用一個循環從n個反覆減去d:

m = n; 
while (m >= d) 
{ 
    m -= d; 
} 

假設你的整數是32位的,那麼你可以考慮的優化版本,我們從n個刪除d的倍數:

m = n; 
for (i = 31; i >= 0; i--) 
{ 
    di = d << i; 
    if (di > 0 && m >= di) m -= di; 
} 

這個例子假設整數已經簽名並注意溢出,即di > 0的測試。

+1

不幸的是,即使您假設正常的二進制補碼機器,溢出的轉換並不一定會導致負數。 –