0%

[Math] 以移位運算優化除數為 2 的冪次方的除法

前言

除法指令在 CPU 中的執行周期相較於其它運算 (加/減/乘) 還要來得長,所以會盡可能的找替代方案來算出除法結果。這裡討論的是,當除以一個 2 的冪次方數時要怎麼減化過程,特別是被除數為負數時的情況。

問題敘述

基本上 xk 等同於 x2k,但這個結果只能保證在 x0 時是對的,若在 x<0 時,可就不一定了!舉例來說,若 x=12345k=4

以除法運算來看,取整數後即 771

xk=123454=1234524=771.5625

在以位元運算來看

1234510410=1100_1111_1100_01112410=1111_1100_1111_11002=772

這與我們想要的結果 (771) 不一樣,因為移位運算後的結果都是取 floor 後的值,即

xk=floor(x2k)

x0,我們要得到整數部份就要取 floor,這與移位運算的特性一致;而當 x<0 時,我們要得到整數部份就要取 ceil,但此時移位運算是取 floor,所以就會有誤。

因此,我們需要一個函數,當 x<0 時作移位運算後結果為 ceil(x2k) 的演算法

(x+(2k1))>>k

證明

目標

ceil(x2k)=(x+(2k1))k

要證明上式,必須先證明下式成立,

ceil(xy)=floor(x+y1y), if x Z and y Z+

x=qy+r, 0ry1

q 為除法商數且 r 為除法餘數。再將此試代入目標等式右邊

x+y1y=qy+r+y1y=q+r+y1y

討論:

case 1:如果 x 可以被 y 整除,則 r=0

floor(x+y1y)=floor(q+y1y)=q=ceil(xy)

case 2:如果 x 不能被 y 整除,則 1ry1

yyr+y1y2y2y1r+y1y<2floor(x+y1y)=floor(q+r+y1y)=q+1=ceil(xy)

最後,再利用這個等式,可以得到若 x < 0

ceil(x2k)=floor(x+2k12k)=(x+(2k1))k

得證

參考文獻

  1. 計算機中如何實現除數是2的冪次的除法
很高興能在這裡幫助到您,歡迎登入 Liker 為我鼓掌 5 次,或者成為我的讚賞公民,鼓勵我繼續創造優質文章。
以最優質的內容回應您的鼓勵