實現除法操作

2021-09-24 08:06:32 字數 1317 閱讀 1948

一道演算法題,涉及到了二進位制的位操作,借這個機會整理一下相關的知識點,並且在這道演算法題中進行了實踐

本文的解法來自於該演算法題的一篇討論。

對除數和被除數實現除法運算,其中不使用乘法、除法和求餘操作,返回對應的商。如,

input: dividend = 10, divisor = 3

output: 3

class solution

return sign > 0 ? result : -result;

}}複製**

暴力解法主要是通過不斷迴圈將y(除數)從x(被除數)中減去,直到x31-1,y=1時,需要迴圈231-1次。

class solution

x -= y << (shift - 1);

//相當於x = y*2^(shift)+y*2^(shift-n)+.....+y*2^(0) + m;m是餘數

result += 1 << (shift - 1);

}return sign > 0 ? result : -result;

}}複製**

這個方法,是計算最大的k,使得y*2k

<=x,然後將y*2k從x中減去,將2k加到商裡面。比如說, 如果x= (1011)2,y=(10)2,那麼因為2*22

<= 11而且2*23>11 所以k=2。所以,我們將 (1011)2減去 (1000)2得到 (11)2,然後,將2k=22=(100)2加到商中,然後將x更新為(11)2繼續運算。

使用y*2k的優勢在於,可以使用非常高效的移位操作,而且每次迴圈後,最差的情況下,x都會變為原來的一半。如果n是x/y的商的位數,那麼總共需要n次迴圈。子迴圈中每次通過迴圈k次來找到y*2k的最大的k,因此:

class solution

x -= y << power;

result += 1 << power;

}return sign > 0 ? result : -result;

}}複製**

1.在每次迴圈中找到最大的k的最好的方式就是認識到k其實是在不斷縮小的。因此,我們不需要在每次子迴圈的時候都檢驗一下21,22,23......是否小於或者等於x,我們可以在找到最大的k後,直接在後面的每次迴圈中檢驗x和2k-1,2k-2,2k-3....的關係。

2. 我們可以繼續之前的例子。商為(100)2後,我們繼續計算(11)2。因為y*2k

<=x的最大k是0,所以我們把20=(1)2加到商裡,因此商就變成了(101)2。然後我們繼續演算法,因此(1)2

2,y=(10)2相除,商為(101)2,餘數為(1)2。

不用除法實現 13操作 位操作

今天上自習了,過幾天就要考試軟體工程了,但是把它複習一偏後就沒有心思上自習了,效率明顯的降低了,我一般對待這種事情的方式是及時終止,揹著書包就回寢室了.想起前幾天在csdn上看的用位操作實現 13的操作,現在恰好在水木上看了乙個類似的問題,有個演算法,實現簡單,有能夠滿足要求.描敘 n 8 x y ...

只使用 實現減法 乘法 除法操作

a 乘法 int multi int op1,int op2 b 減法 int sub int op1,int op2 c 除法 int div int op1,int op2 分析 乘法 a b就等於b個a相加。題目也說了不考慮效能。減法 a b就等於a 1 b 就等於a加上b的相反數,得到b的相...

BigDecimal做除法操作

bigdecimal做除法操作 bigdecimal b1 newbigdecimal 1000 bigdecimal b2 newbigdecimal 100 system.out.println b1.divide b2,2,bigdecimal.round half up tostring 輸...