使用移位運算和加減法實現乘除法

2021-07-11 01:20:07 字數 746 閱讀 2988

這個想法是在做leetcode 的題目29 

divide two integers時產生的,原題描述如下:

divide two integers without using multiplication, division and mod operator.

if it is overflow, return max_int.

就是說不用乘除取餘運算來實現兩個int醒變數的整除,然後如果溢位的話就返回int_max。

先把問題簡化一下,不考慮溢位問題,並且假設被除數n大於除數m大於0,嗯,基於這個假設,剩下的就是純粹的演算法部分了。說到整除問題,有n/m==k+r(r==n mod m),也就是我們小學學過的被除數除以除數等於商加餘數。根據這個公式很自然的想到用n逐次減去m直到差小於m,**如下;

int i=0;

while (n>=m) 

return i;

如果n和m比較接近的話,這樣做還是很快的,但是對於一般情況,其時間複雜度為o(n/m),有些捉急,尤其是n特別大而m又很小的時候,簡直不能忍,按這種思路提交的演算法會提示超時(意料之中)。那麼有沒有別的方法呢?顯然有!答案就是位運算。

使用左移和右移可以很方便地實現乘除2^的n次方,而 n/m==k+r 即 m*k==n-r 即 m*(2^l1+2^l2+……+2^ls)==n-r ,即m<=m)

else

}以上就是我能想到的方法,然後具體到這個題目的話,還要考慮除數為0以及溢位問題,比如被除數為-2^31時該怎麼解決。

用移位和加減運算實現無符號整數除法

同樣是同學遇到的面試題,面試官問的原題是如何用移位和加減實現除以3的操作,在此略微擴充一下,實現無符號整數除法,但是返回值也為無符號整型。方法一 類似小學學習的除法運算,從高位開始減去除數,此處用除數左移到跟被除數對齊,在相減之前商也同樣需要左移,如下。include using namespace...

浮點數加(減)法 乘法 除法運算

ieee754標準規定了3種浮點數格式 單精度 雙精度與擴充套件精度 ieee754標準從邏輯上用三元組表示乙個數n,對於雙精度而言,其編碼格式為1位符號位,11位階碼和52位尾數 n 1 s x 2 e 1023 x 1.m 1 浮點數的加減法運算 加減法的本質相同,減法可以通過對減數的符號位取反...

C C 中移位實現乘除法運算

用移位實現乘除法運算 a a 4 b b 4 可以改為 a a 2 b b 2 說明 除2 右移1位 乘2 左移1位 除4 右移2位 乘4 左移2位 除8 右移3位 乘8 左移3位 通常如果需要乘以或除以2的n次方,都可以用移位的方法代替。大部分的c編譯器,用移位的方法得到 比呼叫乘除法子程式生成的...