前言:優化
原本是在看彙編裏面的數據條件傳送指令,作習題的時候看着這麼一道有關於2的冪次方除法的題目。結果傻眼了,又尼瑪不會了。。。。。。。。。第二章看的時候就稀裏糊塗的,看了幾遍也沒看太懂,這回又涉及到了 ,發現再回來看仍是容易一點。因此寫此博文,方便往後複習。spa
我今天遇到的問題以下:blog
問題:file
除法,在咱們平時的算數運算中,結果老是向0的方向舍入的,可是在計算機中,舍入的方式有所不一樣。在大多數的機器中,除法要比乘法還有加法這些運算都要慢不少倍,計算機中對於2的冪次這種數非常敏感,由於計算機當中用到的指令和進制原本就是二進制的形式,計算機用這種方式運算是最快的。因此,在作除法時若是除數是2的冪次,那麼咱們就能夠進行一些優化,讓運算作到更加快速。二進制
解決辦法:方法
由於左移運算至關因而乘以2,右移運算至關於除以2.因此說當咱們的除法的除數是2的冪次方的時候,利用單純的移位運算要比利用普通方法快的多。im
對於無符號數來講, 若是除數是2的k次冪,那麼咱們就會把被除數啊相應的作算數右移操做,右移k位。這樣的結果和平時咱們作除法的結果是同樣的。d3
對於無符號數來講,假設x是一個有w位的二進制數,x'是從第w位到k位的序列,x''是0-k位的序列。那麼x' =floor(x/2^k),這個表達式是能夠證實的,過程仍是很easy的我就很少說了。數據
對於一個無符號數還有一個有符號數的非負數來講的話,除以2的k次冪和把被除數右移k位的結果是同樣的db
可是對於有符號數的負數來講,就會有一些差錯。
在 十進制那一欄裏面是計算機的計算結果舍入以後的結果,最右邊一欄是計算機算的結果,咱們能夠看出來,在整除也就是不須要舍入的時候,結果和右移k位的操做是同樣的,可是若是一旦沒有整除須要進行舍入的時候,咱們就會發現出了問題了,移位致使它不是向0舍入而是向下舍入,-771.25按理說應該舍入爲-771,可是他卻舍入到了-772.
在平時進行手算除法的時候,咱們的結果統一都是向0舍入的,可是在計算機中確實向下舍入,由於非負數向下舍入就是向0舍入因此不會有影響,可是負數的話就不會了。由於移位以後,負數在左邊補充的是最高的符號位,而不是0.負數在作除法的 時候應該是向上舍入才符合手算中向0舍入的規則。
對於負數除法向0舍入的解決辦法:
爲了保證正確的舍入方式,咱們決定利用一個偏置值來解決這個問題。
對於任何整數x和y>0,有ceil(x/y) = floor((x+y-1)/y)
假設x=ky + r (r>=0 && r < y span>
咱們就能夠清楚(x+y-1)/y = (ky+ r - 1)/y = k + (r + y - 1)/y
若是此時x能整除y,即r = 0,那麼ceil(x/y) = floor((x+y-1)/y) = k
不然的話等於k + 1那麼也就是說,在計算被除數是負數,除數是2的冪次的除法的時候,能夠給x加上除數-1(y-1)這個偏移量,便可保證除法的結果是正確的,由於在除數是2的冪次的時候,纔可以用右移操做來進行替代,則當被除數是負數的時候,要給他加上2^k - 1這個偏移量,纔可以獲得正確的結果。
因此在計算機內若是除數是2的冪次的時候,是會用向下面的這個表達式的形式去計算除法的的
(x < 0 x k -x >> k