0%

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

前言

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

問題敘述

基本上 $x\gg k$ 等同於 $\dfrac{x}{2^k}$,但這個結果只能保證在 $x \geq 0$ 時是對的,若在 $x < 0$ 時,可就不一定了!舉例來說,若 $x=-12345$ 且 $k=4$

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

在以位元運算來看

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

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

因此,我們需要一個函數,當 $x < 0$ 時作移位運算後結果為 $ceil(\dfrac{x}{2^k})$ 的演算法

證明

目標

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

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

討論:

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

case 2:如果 $x$ 不能被 $y$ 整除,則 $1\leq r\leq y-1$

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

得證

參考文獻

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